Nathan Wittich PSYCHIC-OLOGIST wittich@cdsnet.net 09-18-96 (18:27) QB, QBasic, PDS 76 3240 PSYCHIC.BAS DATA "what does that make you think?"πDATA "have you thought much about the end result of that?"πDATA "maybe we should talk about something else."πDATA "you realize I only listen to you since it's my job. But go on."πDATA "if that's entirely true, you would have made more of a point."πDATA "pretending you are your guardian angel, tell me your opinion."πDATA "what if you were to walk off a cliff today?"πDATA "are you aware of your surroundings much?"πDATA "if you were, you'd understand I might not be"πDATA "time for you to get a break for a while."πDATA "how come you always say dumb responses?"πDATA "You come here to share your problems with me."πDATA "Is there something I should know?"πDATA "maybe you should tell me things in more detail."πDATA "Is that really the reason?"πDATA "do you even trust me?"πDATA "It's OK. I understand. It's my job to understand. My job is to help you."πDATA "more secrets, less mumbo-jumbo, OK."πDATA "I don't know why I even try. Wait, I do, It's my job."πDATA "Is there something you'd rather be talking about?"πDATA "I look like this :-) but even us psychologists lie."πDATA "You know what I think?"πDATA "There was a cat that wore a hat and sat on mat and it was fat and that was that."πDATA "You need a vacation."πDATA "There's a pot of gold at the end of every rainbow."πDATA "When is groundhog day?"πDATA "You need to look at the big picture."πDATA "what was accomplished?"πDATA "You should be more assertive"πDATA "You should finish something"πDATA "Don't you even pay attention to your instincts? They're there to help you."πDATA "You don't understand how others see you"πDATA "What's your ultimate goal?"πDATA "You tend to concentrate too much on one thing and forget another thing: Comb hair, ignore teeth. You're nice, but think too fast..."πDATA "Do you try many new things?"πDATA "Want my advice? Take a philosphy class."πDATA "I think your dog understands you better than most people."πRANDOMIZE TIMERπt = RND * 100 'all this weird random number stuff is neccesary because πd = RND * 10 'it seems to say the same thing and then another one a lot if you don'tπi = TIMER * RNDπRANDOMIZE TIMER + d + RND * 10πFOR u = 1 TO RND * 100: j = RND * 5: NEXTπRANDOMIZE t + TIMERπCLSπDIM n$(200)πFOR a = 1 TO 37πREAD n$(a)πNEXT aπPRINT "hello. Welcome to psychic-ologist by Nathan Wittich"πPRINT "This 'Artificial inteligence' will talk to you. Note: if something"πPRINT "doesn't directly make sense, It may be sort of symbolic or something."πPRINTπPRINT "Also, you have to act human for me to act human. For example, if"πPRINT "a human says something twice, you say 'you already said that' not"πPRINT " 'you're stupid'."πPRINTπPRINT "Also note: you don't have to answer."πINPUT "", a$πPRINT "Look! A duck!"πDOπCOLOR 8 + RND * 7πLINE INPUT "", a$πCOLOR 1 + INT(RND * 8)π40 g$ = n$(1 + INT(RND * a))πIF INSTR(h$, g$) > 0 THEN GOTO 40πIF LEN(h$) > 1000 THEN h$ = MID$(h$, 50)πh$ = h$ + g$πPRINT g$πFOR f = 1 TO d: NEXTπLOOPππ' this program was written by Nathan Wittich wittich@cdsnet.netπ' I've had some pretty long conversations with it.π' When you run it, it will seem like it always picks the right phrase π' randomly.πSteve Horstmeyer CALCULATE WIND CHILL Internet 10/95 (00:00) QB, QBasic, PDS 153 4975 WINDCHL.BAS 'BASIC LANGUAGE PROGRAM TO CALCULATE WIND CHILL BASED ON SIPLE FORMULAπ' WEATHERWISE MAGAZINE OCTOBER/NOVEMBER 1995 BY STEVE HORSTMEYERπ'RUNS UNDER DOS v5.x & V6.x QBASIC, OR QUICKBASIC OR QUICKBASIC EXTENDED.π'THIS PROGRAM WILL NOT RUN UNDER OLDER VERSIONS OF GWBASIC, BASIC OR BASICAπ'FROM DOS V4.X OR EARLIER. LINE NUMBERS ARE NOT REQUIRED IN QBASIC, WHEREπ'NEEDED A LINE CAN HAVE A LABEL LIKE CHOOSEMODE: ONEWCHILL: AND TABLE: BELOW.ππDIM WTABLE(11, 13), TEMPS(13), WIND(11)πCLSπ'DEF FNWCT defines a function that calculates wind chill using the Sipleπ'formula. Statement IF VEL<=4 sets wind chill to temp if wind is <=4mph.π'to de-activate add 'to make lie a comment, result is roundedππDEF FNWCT (VEL, TMP)π WC = .0817 * (3.71 * (VEL ^ .5) + 5.81 - .25 * VEL) * (TMP - 91.4) + 91.4π IF VEL <= 4 THEN WC = TMPπ FNWCT = CINT(WC)πEND DEFππCLSπLOCATE 2, 9: COLOR 14, 0: PRINT "BASIC LANGUAGE PROGRAM TO CALCULATE WIND CHILL USING SIPLE FORMULA"πLOCATE 5, 20: PRINT "REQUIRES MS-DOS (V5.X OR HIGHER) QBASIC "πLOCATE 6, 21: PRINT "OR QUICKBASIC OR QUICK BASIC EXTENDED"πLOCATE 7, 27: PRINT "WEATHERWISE NOVEMBER 1995"πLOCATE 8, 30: PRINT "BY STEVE HORSTMEYER"πLOCATE 10, 34: COLOR 31, 0: PRINT "PRESS ANY KEY"πWHILE INKEY$ = "": WENDπππ'*****determine if user wants a single value or table*****πCHOOSEMODE:π CLS : COLOR 7, 0π LOCATE 3, 1: PRINT "TO CALCULATE A SINGLE VALUE PRESS S "π LOCATE 5, 1: PRINT "TO DISPLAY A TABLE PRESS T "π INPUT MODE$: MODE$ = UCASE$(MODE$)π SELECT CASE MODE$π CASE "S"π GOSUB ONEWCHILLπ CASE "T"π GOSUB TABLEπ CASE ELSEπ GOTO CHOOSEMODEπ END SELECTπENDπ'*******************SUBROUTINES*****************π'*****find single windchill*****πONEWCHILL:π CLS : COLOR 7, 0π LOCATE 2, 1: INPUT "ENTER TEMPERATURE (F) "; T: T = CINT(T)π LOCATE 4, 1: INPUT "ENTER WIND VELOCITY (MPH) "; V: V = CINT(V)π IF V < 0 THENπ CLS : LOCATE 1, 1: COLOR 30, 0π PRINT "WIND VELOCITY MUST BE POSITIVE"π COLOR 30, 0π PRINT "TO START AGAIN PRESS ANY KEY"π WHILE INKEY$ = "": WENDπ GOTO ONEWCHILLπ END IFππ CLSπ LOCATE 2, 1: PRINT "WIND CHILL BASED ON SIPLE FORMULA"π LOCATE 4, 1: PRINT "TEMPERATURE "; T; "F AND"π LOCATE 6, 1: PRINT "WIND VELOCITY "; V; "MPH"π COLOR 9, 0: LOCATE 8, 1: PRINT "WIND CHILL = "; FNWCT(V, T); " F"ππREPEAT:π LOCATE 12, 1: COLOR 14, 0: INPUT " ANOTHER S, RESTART R OR EXIT E "; AGAIN$π AGAIN$ = UCASE$(AGAIN$)π SELECT CASE AGAIN$π CASE "S"π GOTO ONEWCHILLπ CASE "R"π GOTO CHOOSEMODEπ CASE "E"π ENDπ CASE ELSEπ GOTO REPEATπ END SELECTπRETURN: '*****end of subroutine to calculate single value*****π'*****calculate and display table*****πTABLE:π CLSπ LOCATE 3, 1: PRINT "ENTER MINIMUM TEMPERATURE (FOR >80 PROGRAM DEFAULTS TO 80)"π LOCATE 5, 1: PRINT "TABLE WILL BE CALCULATED FOR 5 DEGREE INCREMENTS"π LOCATE 7, 1: PRINT "WIND SPEEDS ARE FIXED FROM ZERO TO 45 MPH IN 5 MPH INCREMENTS"π LOCATE 9, 1: COLOR 30, 0: PRINT "PRESS ANY KEY TO CONTINUE"π WHILE INKEY$ = "": WEND: COLOR 14, 0ππ LOCATE 12, 1: INPUT "ENTER LOWEST TEMPERATURE F"; MNTEMPπ MNTEMP = CINT(MNTEMP): COLOR 7, 0π IF MNTEMP > 80 THEN MNTEMP = 80ππ FOR V = 0 TO 50 STEP 5π WINDEX = V / 5: WIND(WINDEX) = V: TINDEX = 0π FOR T = MNTEMP TO MNTEMP + 60 STEP 5π TEMPS(TINDEX) = Tπ WTABLE(WINDEX, TINDEX) = FNWCT(V, T): TINDEX = TINDEX + 1π NEXT T: NEXT Vππ'*****display table on screen*****πWRITETABLE:π CLS : COLOR 14, 0π LOCATE 2, 2: PRINT "WIND": LOCATE 2, 33: PRINT "AIR TEMPERATURE"π FOR I = 0 TO 12π PRINT TAB(10 + I * 5); TEMPS(I);π NEXT Iππ LOCATE 3, 3: PRINT "VEL": COLOR 7, 0π FOR I = 2 TO 4π LOCATE I, 9: PRINT "|"π NEXT Iππ LOCATE 4, 10: PRINT STRING$(70, "="): LOCATE 3, 10π π FOR ROW = 0 TO 9π LOCATE 2 * ROW + 5, 4π COLOR 14, 0: PRINT WIND(ROW)π COLOR 7, 0: LOCATE 2 * ROW + 5, 9: PRINT "|"ππ FOR COLUMN = 0 TO 12: COLOR 15, 0π SELECT CASE WTABLE(ROW, COLUMN)π CASE IS > TEMPS(COLUMN)π IF WTABLE(ROW, COLUMN) > 120 THENπ COLOR 4, 0π ELSE COLOR 12, 0π END IFπ CASE 11 TO 32π COLOR 1, 0π CASE -20 TO 10π COLOR 9, 0π CASE -49 TO -21π COLOR 13, 0π CASE IS <= -50π COLOR 29, 0π END SELECTππ LOCATE 2 * ROW + 5, 10 + COLUMN * 5: PRINT WTABLE(ROW, COLUMN)π LOCATE 2 * ROW + 6, 9: COLOR 7, 0: PRINT "|";π NEXT COLUMN: NEXT ROWππ COLOR 14, 0π LOCATE 25, 1: INPUT "PRESS <R> TO RESTART PRESS <E> TO EXIT "; RERUN$π RERUN$ = UCASE$(RERUN$)π SELECT CASE RERUN$π CASE "E"π CLSπ ENDπ CASE "R"π GOTO CHOOSEMODEπ CASE ELSEπ GOTO WRITETABLEπ END SELECTπRETURN: '*****end of table subroutine*****πKurt Kuzba IMPORT ANSI INTO BASIC FUNCTIONFidoNet QUIK_BAS Echo 10-06-96 (08:23) QB, QBasic, PDS 65 3210 ANSIFUNC.BAS'> ansi for a menu in a quickbasic program without havingπ'> the ansi in a seperate file that has to be loaded andπ'> without ansi.sys loaded. Is this possible?π'>...........π' Yes. It is. This will put the .ANS into code, and, inπ'another message, I post an ANSI interpreter. It should be next.ππ '|====================== begin ANSIFUNC.BAS =======================|π '| This is a QBasic program to convert an ANSI file to a QBasic |π '| FUNCTION that will return the file as a string. In the program |π '| this program produces, the function is called and the resulting |π '| string is output to CONSOLE, which requires ANSI.SYS loaded. |π '| Released to the Public Domain by Kurt Kuzba |π '|===================================================================|π ' set error trap, set colors, clear screen, q$ = quote mark ==========πON ERROR GOTO Done: COLOR 2, 0: CLS : q$ = CHR$(34)π ' create a string for the input boxes ===============================πi$ = STRING$(16, " ") + STRING$(15, CHR$(29))π ' print message and get filename from user, open file for input ======πLOCATE 5, 10: PRINT "We will turn an ANSI file into a QBasic function"πLOCATE 6, 10: PRINT "which returns the entire ANSI file as a string."πLOCATE 8, 10: PRINT "Enter ANSI name [ EX. MYPIC.ANS ] ";πCOLOR 1, 7: PRINT i$; : INPUT "", ans$: COLOR 2, 0πIF ans$ <> "" THEN OPEN ans$ FOR INPUT AS #1: ELSE GOTO Doneπ ' get name of function to create from user ===========================πLOCATE 10, 10: PRINT "Enter Function name [ EX. Pic1$ ] ";πCOLOR 1, 7: PRINT i$; : INPUT "", func$: COLOR 2, 0π ' make FUNCTION name and open file for input =========================πIF func$ = "" THEN GOTO DoneπIF RIGHT$(func$, 1) <> "$" THEN func$ = func$ + "$"πname$ = func$ + ".bas": OPEN name$ FOR OUTPUT AS #2π ' write QBasic FUNCTION to file ======================================πPRINT #2, "DECLARE FUNCTION "; func$; "()"πPRINT #2, "open "; q$; "CONS:"; q$; " FOR OUTPUT AS #1"πPRINT #2, "PRINT #1, "; func$πPRINT #2, "FUNCTION "; func$πPRINT #2, "t$ = "; q$; q$π ' process ANSI to create QBasic routine to construct string ==========πWHILE NOT EOF(1)π WHILE NOT EOF(1)π PRINT #2, "t$=t$+"; q$; : C$ = ""π WHILE C$ <> CHR$(10) AND NOT EOF(1)π C$ = INPUT$(1, #1)π IF C$ = CHR$(13) THENπ C$ = q$ + " + CHR$(13) + CHR$(10)" + CHR$(13) + CHR$(10)π END IFπ IF C$ <> CHR$(10) THEN PRINT #2, C$;π WENDπ WENDπWENDπ ' finish writing QBasic FUNCTION to file =============================πPRINT #2, q$πPRINT #2, func$; "=t$"πPRINT #2, "END FUNCTION"π ' done, tell user new program is ready, wait for key =================πLOCATE 12, 10: COLOR 10πPRINT "Your new program, "; name$; ", containing the FUNCTION"πLOCATE 13, 10: PRINT func$; ", to display "; ans$; ", is ready to test."πLOCATE 14, 10: PRINT "ANSI.SYS must be loaded for "; name$; " to work."πDone: CLOSE 1: CLOSE 2: C% = 0: i$ = ""πWHILE i$ = ""π C% = (C% + 1) AND 15: LOCATE 15, 10: COLOR C%: PRINT "Hit a Key"π i$ = INKEY$πWEND: COLOR 2π '| =============== end ANSIFUNC.BAS ==============================|πTony Jones LOADS 320X200X256 PCX IMAGES arafel1@ix.netcom.com 09-17-96 (00:00) ASIC 244 4320 SHOWPCX.ASI REM -- Filename: SHOWPCX.ASIπREM -- Developed with ASIC 5.00πREM -- Description: Decodes and displays 320x200,256 color PCX imagesπREM -- Date: September 17,1996πREM -- Author: Tony JonesπREM -- E-Mail: arafel1@ix.netcom.comππREM -- Use in any way you wish, but give credit where credit is due. :-)πREM -- Compile with Extended Math on.ππREM -- Decodes a PCX file, fades the image in, waits for a key pressπREM -- and then fades the image out.ππREM -- Array's to hold the palette data.πDIM Red(256)πDIM Green(256)πDIM Blue(256)ππREM -- We parse the command line for the name of our PCX file.πFileName$=COMMAND$πFileName$=LTRIM$(FileName$)ππIF FileName$ = "" THENππ PRINTπ PRINT "USAGE: SHOWPCX <filename>, where filename is a 320x200, 256 color"π PRINT "PCX file with extension."π PRINTππ ENDππENDIFππREM -- Enter Mode 13hπSCREEN 13ππREM -- Open the fileπOPEN "R",1,FileName$ππREM -- Check to see if the file existπIF ERROR > 0 THENπ SCREEN 0π PRINTπ PRINT " Error opening ";π PRINT FileName$;π PRINT "!"π PRINTπ ENDπENDIFππREM -- Check to see if its a 320x200, 256 color PCX fileπREM -- The first byte should be 10, the second should be 5.πINPUT#1, Man$ BYTEπCheck = ASC(Man$)πIF Check <> 10 THENπ CLOSE 1π SCREEN 0π PRINTπ PRINT " Not a valid PCX file!"π PRINTπ ENDπENDIFππINPUT#1, Ver$ BYTEπCheck = ASC(Ver$)πIF Check <> 5 THENπ CLOSE 1π SCREEN 0π PRINTπ PRINT " Not a valid PCX file!"π PRINTπ ENDπENDIFππREM -- Set the palette to black so we can fade the image in later.πFOR Index = 0 TO 255π OUT(&hex3c8,Index)π OUT(&hex3c9,0)π OUT(&hex3c9,0)π OUT(&hex3c9,0)πNEXT IndexπππREM -- Load the palette.πREM -- Position the file pointer 768 bytes from the end of the file.πLENG& = FILELEN(FileName$)πLENG& = LENG& - 768&πTemp&=FILEPOS(1,LENG&)ππFOR Index = 0 TO 255π REM -- Get the red,green and blue valuesπ INPUT#1, R$ BYTEπ INPUT#1, G$ BYTEπ INPUT#1, B$ BYTEππ Red(Index) = ASC(R$)π Red(Index) = Red(Index) / 4π Green(Index) = ASC(G$)π Green(Index) = Green(Index) / 4π Blue(Index) = ASC(B$)π Blue(Index) = Blue(Index) / 4πNEXT IndexπππREM -- Position the file pointer 128 bytes from the startπTemp&=FILEPOS(1,128)ππREM -- Decode the PCX dataππCounter& = 0&πWHILE Counter& < 64000&ππ REM -- Get the dataπ INPUT#1, Dat$ BYTEππ REM -- See if this is a run.π ACode = ASC(Dat$)ππ IF ACode > 191 THENπ REM -- How many bytes are in the run.π NumBytes = ACode - 192ππ REM -- Get the actual data for the runπ INPUT#1, Dat$ BYTEπ ACode = ASC(Dat$)ππ REM -- Put the data on the screen NumBytes times.π DEFSEG = &hexA000ππ WHILE NumBytes > 0π POKE Counter&,ACodeπ Counter& = Counter& + 1&π NumBytes = NumBytes - 1π WENDππ DEFSEG = -1ππ ELSEπ REM -- Else just put the data on the screenπ DEFSEG = &hexA000ππ POKE Counter&,ACodeπ Counter& = Counter& + 1&ππ DEFSEG = -1ππ ENDIFππWENDππREM -- Close the fileπCLOSE 1ππREM -- Fade the image inπFOR Count = 0 TO 31ππ FOR Index = 0 TO 255ππ OUT(&hex3c7,Index)π TR = INP(&hex3c9)π TG = INP(&hex3c9)π TB = INP(&hex3c9)ππ IF TR < Red(Index) THENπ TR = TR + 2π ENDIFππ IF TG < Green(Index) THENπ TG = TG + 2π ENDIFππ IF TB < Blue(Index) THENπ TB = TB + 2π ENDIFππ OUT(&hex3c8,Index)π OUT(&hex3c9,TR)π OUT(&hex3c9,TG)π OUT(&hex3c9,TB)ππ NEXT Indexπππ REM -- Delay for a while to make the fade smooth.π Thn& = TIMERπ Elapsed& = 0&π WHILE Elapsed& < 2&π Now& = TIMERπ Elapsed& = Now& - Thn&π Elapsed& = ABS(Elapsed&)π WENDππNEXT CountππK$=""πREM -- Wait for a key press and then exitπWHILE K$=""π K$=INKEY$πWENDππREM -- Fade the image outπFOR Count = 0 TO 31ππ FOR Index = 0 TO 255ππ OUT(&hex3c7,Index)π TR = INP(&hex3c9)π TG = INP(&hex3c9)π TB = INP(&hex3c9)ππ IF TR > 0 THENπ TR = TR - 2π ENDIFππ IF TG > 0 THENπ TG = TG - 2π ENDIFππ IF TB > 0 THENπ TB = TB - 2π ENDIFππ OUT(&hex3c8,Index)π OUT(&hex3c9,TR)π OUT(&hex3c9,TG)π OUT(&hex3c9,TB)ππ NEXT Indexππ REM -- Delay for a while to make the fade smooth.π Thn& = TIMERπ Elapsed& = 0&π WHILE Elapsed& < 2&π Now& = TIMERπ Elapsed& = Now& - Thn&π Elapsed& = ABS(Elapsed&)π WENDππNEXT CountππREM -- Back to text modeπSCREEN 0ππENDπScott Turchin XOR ENCRYPTION nitehawk@tscnet.com 10-14-96 (23:58) QB, QBasic, PDS 20 791 ENCRYPT.BAS 'This SUB is old by internet standards of encryption, and there are π'certain legalities for certain encryption methods due to a patent on π'some types of encryption. But this one utilizes the XOR and again, is π'old by internet standards, but EXCELLENT for encrypting strings inside π'an executable or a library (Registration purposes etc.) I've tested it π'with executable files and it will apparantly encrypt anything.π'PW$ is the password, if given again exactly the same as it was used to π'ENCRYPT St$, it will DECRYPT, otherwise it will re-ENCRYPT the St$πSUB ENCRYPT (PW$,St$) PUBLICπZ=0πtarget$=""πFOR Y=1 TO LEN(St$)π A$=MID$(St$,Y,1)π INCR Z,1π IF Z > LEN(PW$) THEN Z=1π B$=MID$(PW$,Z,1)π Target$=Target$+CHR$(ASCII(A$) XOR ASCII(B$))πNEXTπSt$=Target$πEND SUBπAndrew K. Dart CONVERT UNIX TIME STAMP FidoNet QUIK_BAS Echo 10-14-96 (17:32) QB, QBasic, PDS 70 2436 UNIXTIME.BAS'Note: My real name is Andrew K. Dart. (Required by the rules!)ππ'I'm sure by now you've been flooded with replies to your question aboutπ'UNIX time stamps, where the date and time is represented by a longπ'integer indicating the number of seconds past midnight, 1/1/1970.π'I would have replied sooner, but there was ideal kite-flying weatherπ'yesterday! Here's what I've pieced together for you:ππREM Program converts UNIX-style date code into day and time.πREM The date code is expressed in the number of seconds sinceπREM midnight, January 1, 1970.ππREM Written 10/14/96 by Andrew K. Dart PUBLIC DOMAINπREM Provided as a public service, with no guarantees.πREM If you're still using UNIX after 12/31/99,πREM you'll need to make a few modifications.ππDIM LastDay(69 TO 99)πLastDay(69) = 0πFOR x = 70 TO 99π LastDay(x) = 365 + LastDay(x - 1)π IF x MOD 4 = 0 THEN LastDay(x) = LastDay(x) + 1πNEXT xππDIM mo(12)πFOR x = 1 TO 12π READ mo(x)πNEXT xπDATA 0,31,59,90,120,151,181,212,243,273,304,334ππINPUT "What is the date code"; Code&πREM maximum allowable date code is LastDay(99) * 86400πREM which is 946,684,800 seconds after 00:00 on 1/1/70.ππDays = Code& \ 86400πFOR x = 70 TO 99π IF Days <= LastDay(x) THEN EXIT FORπNEXT xπ'PRINT USING "Apparently this was sometime in 19##."; xππFOR y = 1 TO 11π IF Days < (LastDay(x - 1) + mo(y + 1)) THENπ PRINT "The date was "; STR$(y); "/";π PRINT RIGHT$(STR$(100 + Days - LastDay(x - 1) - mo(y) + 1), 2);π PRINT "/"; RIGHT$(STR$(100 + x), 2)π EXIT FORπ END IFπNEXT yππREM Now let's figure out what the time of day was:πRawSeconds = Code& MOD 86400πHour = RawSeconds \ 3600πMinute = (RawSeconds - (Hour * 3600)) \ 60πSecond = RawSeconds MOD 60πPRINT "The time was ";πPRINT USING "##:"; Hour;πPRINT RIGHT$(STR$(100 + Minute), 2); ":";πPRINT RIGHT$(STR$(100 + Second), 2)πENDππ'============== END ===============ππ'I presume that you do not want to account for Leap Seconds,π'because the computer clock (on the system running UNIX) probably doesπ'not count them. However if you wanted to use a program like this toπ'figure the exact number of seconds between two times, on two differentπ'dates, you would need to find out whether one or more leap seconds hadπ'occurred between the two dates. For details on leap seconds,π'E-Mail me atπ' andrew.dart@chrysalis.orgπLuke Molnar SOUND BLASTER STARFIELD Blood225@aol.com 09-01-96 (14:51) QB, QBasic, PDS 311 12670 SBSTARS.BAS '*****************************************************************************π'* *π'* This program was written as a demonstration of using the MK Music *π'* Loader / Player in a program that does a moderate amount of *π'* calculations. This is not designed to be the revolutionary graphics *π'* demonstration or anything. *π'* *π'* This program was written by Molnar \ Kucalaba Productions in 1996 *π'* *π'* http://members.aol.com/mkwebsite/index.html *π'* ftp://users.aol.com/blood225/ *π'* *π'*****************************************************************************ππDECLARE SUB InitSong ()πDECLARE SUB Main ()πDECLARE SUB SBInit ()πDECLARE SUB PlayMusic ()πDECLARE SUB InitStars ()πDECLARE SUB CloseChannels ()πDECLARE SUB SetIns (Channel%)πDECLARE SUB WriteReg (Reg%, value%)πππCONST BasePort% = &H220 ' Change this for other sound cards. It is mostπ ' likely 220h. (or 380h for Adlib)ππCLSπSCREEN 13ππ'$DYNAMICπRANDOMIZE TIMERππTYPE StarTypeπ X AS INTEGERπ y AS INTEGERπ Speed AS INTEGERπEND TYPEππDIM SHARED MaxChannel%, MaxNotes%πMaxChannel% = 3πCONST MaxPlay% = -1ππTYPE InsTypeπ MMult AS INTEGERπ MLevel AS INTEGERπ MAttack AS INTEGERπ MSustain AS INTEGERπ CMult AS INTEGERπ CLevel AS INTEGERπ CAttack AS INTEGERπ CSustain AS INTEGERπEND TYPEππTYPE ChannelTypeπ Defined AS INTEGERπ Speed AS SINGLEπ SongPtr AS INTEGERπ PStat AS SINGLEπ Octave AS INTEGERπ WaveForm AS INTEGERπ Flag AS INTEGERπ Flag2 AS INTEGERπ IsPlaying AS INTEGERπ IsDone AS INTEGERπEND TYPEππππDIM SHARED SongBuf(1 TO 790) AS INTEGERπDIM SHARED ChannelStat(1 TO 3) AS ChannelTypeπDIM SHARED Stars(100) AS StarTypeπDIM SHARED CurrentIns AS InsTypeπππ SBInitπ InitStarsπ InitSongπ π Mainππ SBInitπ SYSTEMππSongData:πDATA &HFD,&HFD,&HFD,&H28,&H14,&H28,&HFE,&HFE,&HFE,&H1,&H3,&H3,&HF,&HFF,&H44,&HFE,&H258,&H43,&H2,&H46,&HFD,&HF,&H46,&H14,&HFD,&H46,&H44,&H14,&H15,&H44,&HF,&H46,&H43,&H15,&HFE,&H44,&H46,&H4,&HFF,&H45,&H11,&H14,&HFF,&HFE,&H44,&H28,&H3,&H43,&H46,&HF,&HFF,&H45,&HFF,&H28,&HFF,&H64,&H44,&H14,&HF,&H44,&H46,&HF,&H44,&HFF,&HF,&HFD,&H14,&HF,&H28,&H45,&HF,&HFE,&HFD,&HF,&H3,&H28,&HF,&H44,&HFE,&HFF,&H43,&H1,&H64,&HFD,&HF,&HFE,&H14,&HFE,&H4,&H44,&H2,&H11,&H44,&HF,&H11,&H43,&HFD,&H12,&H44,&H14πDATA &HFF,&HFF,&HF,&H28,&H14,&H15,&H11,&H44,&H46,&H46,&H43,&H45,&H46,&HFF,&HFF,&H46,&H28,&H28,&H46,&H44,&H46,&H46,&H44,&H45,&H46,&H44,&HFF,&H46,&HFD,&H14,&H46,&H28,&H46,&H46,&HFE,&HFF,&H46,&H3,&H14,&HFD,&H44,&H45,&HC8,&H43,&HFD,&H12,&HFD,&H28,&HFD,&H14,&HFE,&H14,&H44,&H1,&H11,&H44,&HF,&H11,&H43,&HFE,&H12,&H44,&H2,&H11,&HFF,&HF,&HF,&H14,&HFD,&HF,&H44,&H14,&HFF,&H43,&HF,&H12C,&HFF,&H15,&HFD,&H28,&H46,&H28,&H44,&H45,&HFE,&H44,&HFF,&H3,&H44,&H28,&HF,&HFD,&H46,&HF,&H28,&H45,&HFF,&HFE,&HFF,&H14πDATA &H3,&H14,&HFD,&H44,&H46,&H14,&H43,&HFF,&HFE,&HFD,&H14,&H4,&H14,&H45,&H12,&H44,&HFD,&H46,&H44,&H28,&H12,&H43,&HFE,&H11,&H44,&H1,&H12,&HFF,&HF,&H46,&H14,&HFE,&H12,&H44,&H2,&H11,&H43,&HF,&H12,&HFF,&HFD,&H46,&H28,&H14,&H12,&H44,&HF,&H11,&H44,&H15,&H12,&H44,&H46,&H46,&HFD,&HF,&H12,&H28,&HFF,&H11,&HFE,&H14,&HFE,&H3,&HF,&H4,&H44,&HFF,&HFD,&H43,&H14,&HA,&HFD,&H46,&HF,&H14,&H15,&H15,&H44,&HFF,&H46,&H44,&H14,&HF,&H43,&HF,&H15,&H44,&HFF,&H46,&HFF,&H14,&HF,&H14,&HFD,&H15,&H44,&H28,&H46,&H43πDATA &HFE,&HF,&HFF,&H2,&H15,&H28,&H12,&H46,&H44,&HFE,&HF,&H44,&H3,&H15,&H44,&H12,&H46,&HFD,&HFD,&HF,&H28,&H14,&H15,&HFE,&H12,&H46,&H3,&H11,&H12,&H44,&HFE,&H11,&H43,&H2,&H12,&HFD,&HF,&HFE,&H14,&H15,&H3,&H44,&HFF,&HF,&H44,&H28,&HFF,&H43,&HF,&H14,&H44,&H15,&HF,&HFF,&HFF,&H15,&H14,&H14,&H46,&H44,&HF,&H12,&H43,&HFF,&H46,&HFF,&H14,&HF,&H28,&H15,&HFF,&H44,&HFD,&H14,&H44,&H28,&HFE,&H44,&HFE,&H5,&HFD,&H2,&H12,&H28,&H12,&H12,&HFE,&HFE,&H12,&H3,&H3,&H12,&H44,&H12,&H12,&H43,&HFD,&H12,&HFD,&H14πDATA &H12,&H14,&H12,&H12,&H44,&H11,&HFD,&H44,&HFE,&H64,&H43,&H2,&H12,&H44,&HF,&HFF,&HFF,&HFE,&H3C,&H14,&H3,&HFB,&H44,&H12,&H0,&H43,&HFF,&H0,&HFF,&H14,&H0,&H28,&H12,&H0,&H44,&HFF,&H0,&H44,&H14,&H0,&H44,&HFE,&H0,&HFD,&H2,&H0,&H28,&HF,&H0,&HFE,&HFE,&H0,&H3,&H3,&H0,&H44,&H11,&H0,&H43,&HFF,&H0,&HFD,&H14,&H0,&H14,&H12,&H0,&H44,&HFF,&H0,&H44,&H14,&H0,&H43,&HFD,&H0,&H44,&H28,&H0,&HFF,&HFE,&H0,&H14,&H1,&H0,&H44,&HF,&H0,&H43,&HFE,&H0,&HFF,&H2,&H0,&H28,&HF,&H0,&H44,&HFD,&H0πDATA &H44,&H14,&H0,&H44,&HF,&H0,&HFD,&H15,&H0,&H28,&H46,&H0,&HFE,&HF,&H0,&H3,&HFF,&H0,&H44,&H14,&H0,&H43,&HF,&H0,&HFD,&HFF,&H0,&H14,&H14,&H0,&H44,&H46,&H0,&H44,&H15,&H0,&H43,&HFF,&H0,&H44,&H14,&H0,&HFF,&HF,&H0,&H14,&HFF,&H0,&H44,&H14,&H0,&H43,&HFD,&H0,&HFF,&H28,&H0,&H28,&HFE,&H0,&H44,&H2,&H0,&H44,&H46,&H0,&H44,&HFE,&H0,&HFD,&H3,&H0,&H28,&H46,&H0,&HFE,&HFD,&H0,&H3,&H14,&H0,&H44,&H46,&H0,&H43,&H12,&H0,&HFD,&HFE,&H0,&H14,&H2,&H0,&H44,&H43,&H0,&H44,&HFE,&H0,&H43πDATA &H3,&H0,&H44,&H46,&H0,&HFF,&HFF,&H0,&H14,&H14,&H0,&H44,&H46,&H0,&H43,&HFF,&H0,&HFF,&H14,&H0,&H28,&HFE,&H0,&H44,&H2,&H0,&H44,&H43,&H0,&H44,&HFE,&H0,&HFD,&H3,&H0,&H28,&H12,&H0,&HFE,&HFF,&H0,&H3,&H14,&H0,&H44,&H46,&H0,&H43,&HFF,&H0,&HFD,&H14,&H0,&H14,&HFD,&H0,&H44,&H14,&H0,&H44,&HFE,&H0,&H43,&H3,&H0,&H44,&H12,&H0,&HFF,&H12,&H0,&H14,&H12,&H0,&H44,&H12,&H0,&H43,&H12,&H0,&HFF,&H11,&H0,&H28,&HFE,&H0,&H44,&H2,&H0,&H44,&HF,&H0,&H44,&HFE,&H0,&H0,&H3,&H0,&H0,&HFπDATA &H0,&H0,&HFF,&H0,&H0,&H28,&H0,&H0,&HFE,&H0,&H0,&H3,&H0,&H0,&H15,&H0,&H0,&H15,&H0,&H0,&H12,&H0,&H0,&HFE,&H0,&H0,&H2,&H0,&H0,&H11,&H0,&H0,&HFF,&H0,&H0,&H28,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0ππInstrumentData:πDATA &H1,&H0,&HE4,&H9D,&H1,&H1F,&HE4,&H9DπDATA &H22,&H2,&H57,&H48,&H71,&H42,&HB3,&HBπDATA &HE1,&H2,&HC8,&HF9,&HF9,&HEC,&HF6,&H6CππREM $STATICπSUB CloseChannelsπFOR Channel% = &HB0 TO &HBFπ CALL WriteReg(Channel%, 0)πNEXTπEND SUBππSUB InitSongπRESTORE SongDataππFOR X% = 1 TO 790π READ SongBuf(X%)πNEXTππRESTORE InstrumentDataππFOR X% = 1 TO 3π ChannelStat(X%).Defined = 1π ChannelStat(X%).SongPtr = 1ππ READ CurrentIns.MMult, CurrentIns.MLevel, CurrentIns.MAttack, CurrentIns.MSustainπ READ CurrentIns.CMult, CurrentIns.CLevel, CurrentIns.CAttack, CurrentIns.CSustainπ π Ficx% = X%π SetIns X%π X% = Ficx%ππNEXTππEND SUBππSUB InitStarsπFOR Fill% = 1 TO 100π Stars(Fill%).X = INT(RND * 320) + 1π Stars(Fill%).y = INT(RND * 200) + 1π Stars(Fill%).Speed = INT(RND * 5) + 1πNEXTππFOR X% = 1 TO 5π OUT &H3C8, X%π OUT &H3C9, X% * 12π OUT &H3C9, X% * 12π OUT &H3C9, X% * 12πNEXTπEND SUBππSUB MainππDOπ π FOR X% = 1 TO 100π PSET (Stars(X%).X, Stars(X%).y), 0π Stars(X%).X = Stars(X%).X + Stars(X%).Speedπ IF Stars(X%).X > 320 THENπ Stars(X%).X = 0π Stars(X%).y = INT(RND * 200) + 1π END IFπ PSET (Stars(X%).X, Stars(X%).y), Stars(X%).Speedπ NEXTππ PlayMusicππLOOP UNTIL INKEY$ <> ""ππEND SUBππSUB PlayMusicππFOR Channel% = 1 TO MaxChannel%ππ IF ChannelStat(Channel%).Defined = 0 THEN GOTO NoGotosPleaseππ RChan% = Channel% - 1ππ IF ChannelStat(Channel%).IsDone = 1 THENπ ChannelStat(Channel%).PStat = TIMER + ChannelStat(Channel%).Speedπ ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π ChannelStat(Channel%).IsDone = 0π ChannelStat(Channel%).IsPlaying = 0π END IFππ IF ChannelStat(Channel%).IsPlaying = 0 AND SongBuf(ChannelStat(Channel%).SongPtr + Channel% - 1) <> 0 THENπ ChannelStat(Channel%).PStat = TIMER + ChannelStat(Channel%).Speedπ SELECT CASE SongBuf(ChannelStat(Channel%).SongPtr + RChan%)π CASE 68π WriteReg &HA0 + RChan%, &H81π WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ CASE 69π WriteReg &HA0 + RChan%, &HB0π WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ CASE 70π WriteReg &HA0 + RChan%, &HCAπ WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ CASE 71π WriteReg &HA0 + RChan%, &H2π WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ CASE 65π WriteReg &HA0 + RChan%, &H41π WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ CASE 66π WriteReg &HA0 + RChan%, &H87π WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ CASE 67π WriteReg &HA0 + RChan%, &HAEπ WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ CASE 17π WriteReg &HA0 + RChan%, &H6Bπ WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ CASE 18π WriteReg &HA0 + RChan%, &H98π WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ CASE 20π WriteReg &HA0 + RChan%, &HE5π WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ CASE 21π WriteReg &HA0 + RChan%, &H20π WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ CASE 15π WriteReg &HA0 + RChan%, &H63π WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ π CASE 255π ChannelStat(Channel%).IsPlaying = 1π ChannelStat(Channel%).PStat = TIMER + SongBuf(ChannelStat(Channel%).SongPtr + Channel% - 1 + MaxChannel%) / 100π ChannelStat(Channel%).Flag = -1π CASE 254π ChannelStat(Channel%).Octave = SongBuf(ChannelStat(Channel%).SongPtr + Channel% - 1 + MaxChannel%)π ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π CASE 253π ChannelStat(Channel%).Speed = SongBuf(ChannelStat(Channel%).SongPtr + Channel% - 1 + MaxChannel%) / 100π ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π CASE 252π ChannelStat(Channel%).WaveForm = SongBuf(ChannelStat(Channel%).SongPtr + Channel% - 1 + MaxChannel%) - 300π ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π IF RChan% > 2 THEN RRChan% = RChan% + 6 ELSE RRChan% = 0π WriteReg &HE0 + RChan% + RRChan%, ChannelStat(Channel%).WaveFormπ CASE 251π ChannelStat(1).Flag2 = -1π FOR MaxChan% = 1 TO MaxChannel%π ChannelStat(MaxChan%).SongPtr = 1π ChannelStat(MaxChan%).IsPlaying = 0π ChannelStat(MaxChan%).IsDone = 0π NEXTπ CloseChannelsπ EXIT SUBπ END SELECTπ END IFππ IF ChannelStat(Channel%).IsPlaying = 1 THENπ IF TIMER >= ChannelStat(Channel%).PStat THENπ WriteReg &HB0 + RChan%, 0π ChannelStat(Channel%).IsDone = 1π IF ChannelStat(Channel%).Flag = -1 THENπ ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π ChannelStat(Channel%).Flag = 0π END IFπ END IFπ END IFπ π IF ChannelStat(Channel%).SongPtr > MaxChannel% + 1 THENπ IF SongBuf(ChannelStat(Channel%).SongPtr + RChan%) <> 0 AND SongBuf(ChannelStat(Channel%).SongPtr - MaxChannel% + RChan%) < 250 THENπ IF ChannelStat(Channel%).IsPlaying = 0 THEN ChannelStat(Channel%).IsPlaying = 1π END IFπ END IFππNoGotosPlease:πNEXT Channel%πππFOR Channel% = 1 TO MaxChannel%ππ IF ChannelStat(Channel%).IsPlaying = 0 THENπ ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π IF ChannelStat(Channel%).SongPtr >= UBOUND(SongBuf) / MaxChannel% THENπ ChannelStat(Channel%).SongPtr = 1π END IFπ END IFπNEXT Channel%πππEND SUBππSUB SBInitπ FOR z% = 1 TO &HF5π WriteReg z%, 0π NEXT z%πEND SUBππSUB SetIns (Channel%)πCarChan% = Channel% - 1πWriteReg &H20 + CarChan%, CurrentIns.CMultπWriteReg &H23 + CarChan%, CurrentIns.MMultπWriteReg &H40 + CarChan%, CurrentIns.CLevelπWriteReg &H43 + CarChan%, CurrentIns.MLevelπWriteReg &H60 + CarChan%, CurrentIns.CAttackπWriteReg &H63 + CarChan%, CurrentIns.MAttackπWriteReg &H80 + CarChan%, CurrentIns.CSustainπWriteReg &H83 + CarChan%, CurrentIns.MSustainπEND SUBππDEFINT A-ZπSUB WriteReg (Reg%, value%)πOUT BasePort% + 8, Reg%π FOR V% = 1 TO 6π Buf% = INP(BasePort% + 8)π NEXTπOUT BasePort% + 9, value%π FOR V% = 1 TO 34π Buf% = INP(BasePort% + 9)π NEXTπEND SUBππLAlvin Williams DIRECTORY LISTER jw32@gnn.com 10-17-96 (16:56) QB, PDS 883 26361 DIRLIST.BAS DECLARE SUB Help ()π' DirLister.. (C) WASC. 1994. See legal-release belowπ' internet: LATEAGAIN@DELPHI.COMππ' DirLister is a Subroutine to display and navigate through directories inπ' multiple columns and pages. I wrote it because i can't stand scrollingπ' pick lists and it's similar to a commercial product i use a lot.π'π' You may change the....π' ..number of columns, number of rows , starting screen row andπ' starting screen column. See the line...π'***USER VARIABLES***π' ...in the ListDir sub.π'π' Since PDS's DIR$ function won't return a Directory (duh!)π' and QB dosn't have any DIR$ function, you willπ' have to load a library with the Interrupt call's.π' ie:π' qb listdir / l c:\qb45\qb.qlbπ' or qbx listdir /l c:\bc7\libs\qbx.qlb for PDS 7.1π' Since more people seem to have QB4.5 than PDS, i've re-coded this toπ' run as QB4.5 compatable.π'π' PDS users need to swap the lines...π' 'Regs.ds = SSEG(spec$) 'PDS 7.1π' Regs.ds = VARSEG(spec$) 'QB4.5π' ..in FUNCTION qbdir$()π' ..or not, depending on farstring usage.π'π' ...also the qbcurdir$() function can be removed and replacedπ' with the PDS func, CURDIR$.π'π' MONO and HERC users need to redo all the COLOR statements.π'π' The source code to DirLister is made available to readers of theπ' All Basic Code Packets of ABC only.π' Any other distribution of the source code is prohibited.π' You may use/include/sell the compiled or 'Binary' version in anyway youπ'see fit.πππππDEFINT A-ZπDECLARE SUB DirLister (weAlreadyDidItYN%, thisfile%, mask$, dr$, tag%, dircnt%, numfiles%)πDECLARE SUB mainInput (prmpt$, cmdm2$, mode%, modet%)πDECLARE FUNCTION qbdir$ (mode%, spec$, a%)πDECLARE FUNCTION qbcurdir$ ()ππ'π'$DYNAMICπ'if using qbx.bi or qb.bi, you shouldn't need this...πTYPE RegTypeXπ ax AS INTEGERπ bx AS INTEGERπ cx AS INTEGERπ dx AS INTEGERπ bp AS INTEGERπ si AS INTEGERπ di AS INTEGERπ flags AS INTEGERπ ds AS INTEGERπ es AS INTEGERπEND TYPEπ' Data transfer Area, we need this and it has to be sharedπTYPE dta0π DTAmisc AS STRING * 21π Attr AS STRING * 1 ' this.....π Time AS INTEGERπ Date AS INTEGERπ Size AS LONGπ filename AS STRING * 13 '..and this, are all we really needπEND TYPEπDECLARE SUB InterruptX (Intnum, InRegs AS RegTypeX, OutRegs AS RegTypeX)ππDIM SHARED regs AS RegTypeXπDIM SHARED buffer AS dta0ππDIM SHARED MaxDirEntry AS INTEGERππ'note: if you only want to return 1 file at a time, then thisπ' wouldn't need to be SHARED. You could REDIM it as necessary in theπ' listdir() sub and erase it as needed. Rework the parameters to listdir()π' so that it returns the file name.πDIM SHARED filename$(1024) 'dir and file namesπDIM SHARED fis%(1024) 'file-is% root=1 dir=2 file=3 tagged file=6ππCALL Helpπmask$ = ""πorgdir$ = qbcurdir$ ' QB.45π'orgdir$ = CURDIR$ 'PDS 7.1πCLSπDOπ IF mask$ = "" THEN ' if user reset mask$ we don't want to mess with itπ mask$ = "*.*"π END IFπ CLSπ CALL DirLister(weAlreadyDidItYN%, thisfile%, mask$, cd$, tag%, dircnt%, numfiles%)π IF thisfile% = 0 THEN 'user pressed <Esc>, quit programπ CLSπ exitLOOPflag% = 1π ELSEπ 'if the select file is a directory... change to itπ IF fis%(thisfile%) = 2 OR fis%(thisfile%) = 1 THENπ 'strip arrow and space..2 charπ IF fis%(thisfile%) = 2 THENπ l% = LEN(filename$(thisfile%))π IF LEN(cd$) = 3 THEN 'in root 'c:\'π m$ = ""π ELSE 'in a dir 'C:\THISDIR' need a '\' on the endπ m$ = "\"π END IFπ s$ = cd$ + m$ + RIGHT$(filename$(thisfile%), l% - 2)π ELSEπ s$ = ".."π END IFπ CHDIR s$π weAlreadyDidItYN% = 0 'new dirπ numfiles% = 0π dircnt% = 0π ELSEπ π PRINT "You selected: ";π IF tag% = 0 THENπ PRINT filename$(thisfile%)π ELSEπ PRINTπ FOR i% = dircnt% TO numfiles%π IF fis%(i%) = 6 THEN PRINT filename$(i%)π NEXT i%π END IFπ PRINT "<Space bar> to see Directory again. "π PRINT "<Esc> or <Q> to quit."π π mainInput "", k$, 1, mt%π IF mt% = 27 THEN k$ = "Q"π SELECT CASE k$π 'put any routines to process files hereπ ' RUN, SHELL, ZIP, DELETE, etc.π CASE "Q" 'Quitπ exitLOOPflag% = 1π END SELECTπ END IFπ END IFπLOOP UNTIL exitLOOPflag% = 1ππ'clean up and exitπIF Xhere% <> 1 THEN ' exit where we startedπ CHDIR orgdir$πEND IFπCLSπCLOSEπENDππREM $STATICπSUB DirLister (weAlreadyDidItYN%, thisfile%, mask$, dr$, tag%, dircnt%, numfiles%)π' DirLister.. (C) WASC. 1994.π' LATEAGAIN@DELPHI.COMππSTATIC filecnt% '<--save this for next go aroundπDIM morep$(4) '<--hold our Page Up , Page Down or both promptπ'set view window to 1-22..put commands and messages 23 to 25πtheBIGloopEXIT% = 0πDO '<---------theBIGloopπVIEW PRINT 1 TO 24ππ IF weAlreadyDidItYN% = 0 THEN 'if we havn't done this beforeπ weAlreadyDidItYN% = 1 'well we're gonna do itπ filecnt% = 0 ' zero this because it's staticπ ' now load sub-dir'sπ dr$ = qbcurdir$ ' QB.45π 'dr$ = CURDIR$ 'PDS 7.1π drive$ = LEFT$(dr$, 2) 'Get the current drive.π null$ = qbdir$(0, "", 24)π d$ = qbdir$(1, "*.*", 16)π IF d$ <> "" THENπ ef% = 0π DOπ GOSUB donameπ d$ = qbdir$(2, "*.*", 16)π IF d$ = "" THEN ef% = 1π LOOP UNTIL ef% = 1π END IFπ 'now sort dirsπ filecnt% = dircnt%π sortStart% = 1: sortend% = filecnt%π GOSUB GSsortfname 'change to CALL QuickSort for speedπ 'z$ = DIR$(mask$) 'PDS 7.1π z$ = qbdir$(1, mask$, 32)π IF z$ <> "" THEN ' if that worked try for moreπ ef0% = 0: nomore% = 0ππ DOπ IF filecnt% >= 1024 THEN nomore% = 1 'too many filesπ IF nomore% = 0 THEN 'still going??π filecnt% = filecnt% + 1π fis%(filecnt%) = 3 'fileπ filename$(filecnt%) = z$π 'z$ = DIR$ 'PDS 7.1π z$ = qbdir$(2, mask$, 32)π IF z$ = "" THEN nomore% = 1 'last oneπ ELSE 'noπ ef0% = 1 ' set loop exitπ END IFπ LOOP UNTIL ef0% = 1ππ ELSE 'no filesπ IF filecnt% = 0 THEN 'no dirs either..must have problemsπ LOCATE 1, 1π PRINT "No files matching "; mask$; " where found."π 'wait for a keypressπ mainInput "", k$, 1, mt%π VIEW PRINT 1 TO 24π EXIT SUBπ END IFπ END IFπ 'sort filesπ sortStart% = dircnt% + 1: sortend% = filecnt%π GOSUB GSsortfnameπ END IF 'end of wealreadygotitYN%ππ 'settings for pgdown page up status and display promptπ morep$(0) = "No more files. "π morep$(1) = "More Files.. Press <Page Down> to show. "π morep$(2) = "More Files.. Press <Page Up> to show. "π morep$(3) = "More Files.. Press <Page Up> or <Page Down> to show. "π l3$ = "Use <Space bar> to tag files. <F2> to change mask(*.*) <F1>=Help <Esc>=Quit "π l% = LEN(l3$): l3$ = l3$ + SPACE$(80 - l%)ππ'show files in dirπ 'filename$() is 12 char wideπ divider$ = " " + CHR$(179) + " " ' do string work onceπ 'divider$ is 3 char wide..so.. fwidth% can't be less than 15.π '***USER VARIABLES*** change as neededπ fwidth% = 15 'make sure this fits num colsπ StartRow% = 3:π StartCol% = 2 'π numRowsIncol% = 20 '***set this anywhere from 2 to 24π ' just make sure it fits the view print windowπ numcols% = 5 'cant be more than 5 or less than 1π '*****************ππ virtRow% = numRowsIncol% + (StartRow% - 1)π wedidcnt% = 0π hirow% = StartRow%: hicol% = StartCol% 'start out at first fileπ oldhirow% = hirow%: oldhicol% = hicol%π thisfile% = 1: oldthisfile% = 1 'set ptr to the first fileπ index% = 0 'for multiple pages ie?:page 2 index=132π oldindex% = 0π wedidcnt% = 0π oldwedidcnt% = 0π numOnScreen% = numcols% * numRowsIncol% 'ie: 110= (22 rows * 5 col )π numFullpages% = filecnt% \ numOnScreen% 'use for <home> <end>π numextra% = filecnt% MOD numOnScreen%π dirpage% = 1π IF LEN(dr$) = 3 THEN 'faster than mid$(π k$ = ""π ELSEπ k$ = "\"π END IFππ numf$ = STR$(filecnt% - dircnt%) + "-Files " + STR$(dircnt%) + "-Director"π IF dircnt% = 1 THENπ numf$ = numf$ + "y" 'little grammer never hurtsπ ELSEπ numf$ = numf$ + "ies"π END IFπ π l% = LEN(numf$)π IF l% <= 80 THEN 'make the line fit the screen nicelyπ numf$ = numf$ + SPACE$(80 - l%)π ELSEπ numf$ = RIGHT$(numf$, 80)π END IFππ title$ = "Dir: " + dr$ + k$ + mask$π l% = LEN(title$)π IF l% <= 80 THENπ title$ = title$ + SPACE$(80 - l%)π ELSEπ title$ = RIGHT$(title$, 80)π END IFππexitLOOP2flag% = 0πDOπ LOCATE StartRow% - 1, 1:π COLOR 0, 7π LOCATE StartRow% - 1, 1: PRINT numf$;π LOCATE StartRow% - 2, 1: PRINT title$;π 'LOCATE StartRow% + numRowsInCol%, 1: PRINT SPACE$(80);π COLOR 7, 0ππ pfLOOPexit% = 0π column% = StartCol% 'start here 1,(0)π rowcnt% = StartRow% - 1 ' we add 1 going in..set to (1 less) nowπ oldindex% = index%π oldthisfile% = thisfile% ' if we are redrawing the page we need thisπ wedidcnt% = oldwedidcnt% 'save to come backππ DO '════════ print filename LOOP pfLOOPexit%π wedidcnt% = wedidcnt% + 1π rowcnt% = rowcnt% + 1 ' next rowπ lastMaxRow% = rowcnt% 'save thisπ maxcol% = column% 'save this for pgup, pgdownπ ' the last column may not have maxrow% 'sπ LOCATE rowcnt%, column%:π IF fis%(wedidcnt%) = 6 THEN 'if file is tagged, then print boldπ COLOR 15, 0π PRINT filename$(wedidcnt%);π COLOR 7, 0π ELSEπ PRINT filename$(wedidcnt%); 'else just printπ END IFπ LOCATE rowcnt%, column% + fwidth% - 2: PRINT divider$;π IF wedidcnt% = filecnt% THEN 'we do em all??π pfLOOPexit% = 1π ELSE 'noπ IF rowcnt% = (numRowsIncol% + StartRow% - 1) THEN ' we fill up this col?π column% = column% + fwidth% ' move over 1 col (15 char)π IF column% > (numcols% * fwidth%) THEN 'IF column% > 70 THEN we fill up screen ?π 'yes , set up to do new screenπ pfLOOPexit% = 1π ELSE 'no ..just move overπ rowcnt% = StartRow% - 1π END IFππ END IFπ END IFπ LOOP UNTIL pfLOOPexit% = 1 '════════print filname LOOP pfLOOPexitπ'ππ 'figure out and set more%, page up and page down flagsπ IF wedidcnt% < filecnt% THENπ IF wedidcnt% > numOnScreen% THEN 'if wedicnt% >110 but < filecnt%π 'we are in the middleπ more% = 3: pgupok% = 1: pgdwnok% = 1 'next and previous pages existπ ELSEπ more% = 1: pgupok% = 0: pgdwnok% = 1 ' just next pages existπ END IFπ ELSEπ IF wedidcnt% > numOnScreen% THEN 'we are equal to file cnt,π 'but previous pages existπ more% = 2: pgupok% = 1: pgdwnok% = 0 'so we show next pages exist but no previousπ ELSE ' no previouspage, no next page..soπ more% = 0: pgupok% = 0: pgdwnok% = 0 'no more filesπ END IFπ END IFππ COLOR 0, 7π LOCATE StartRow% + numRowsIncol%, 1π k$ = " Use arrow keys to move. " + morep$(more%)π l% = LEN(k$): k$ = k$ + SPACE$(80 - l%)π PRINT k$;π LOCATE StartRow% + numRowsIncol% + 1, 1π PRINT l3$;π COLOR 7, 0ππ keyLOOPexit% = 0π DO '════════KEY LOOPπ 'do this to keep from scrolling into a blank spotπ ' in col one of the next pageπ IF maxcol% = StartCol% THEN 'short 1 col page trap for right arrowπ IF hirow% > lastMaxRow% THENπ hirow% = lastMaxRow%: oldhirow% = hirow%π 'reclac thsifile%, save oldThisFile%π GOSUB GScalcThisfileπ oldthisfile% = thisfile% 'reset thisπ END IFπ END IFππ ' print old- location in plain color ie: un-highlite itπ LOCATE oldhirow%, oldhicol%:π IF fis%(oldthisfile%) = 6 THEN 'its taggedπ COLOR 15, 0π PRINT filename$(oldthisfile%);π COLOR 7, 0π ELSE 'it aint taggedπ PRINT filename$(oldthisfile%);π END IFπ ' high-lite current one in different colorπ LOCATE hirow%, hicol%:π IF fis%(thisfile%) = 6 THEN 'its taggedπ COLOR 15, 4π ELSE 'no tagπ COLOR 0, 4π END IFπ PRINT filename$(thisfile%);π COLOR 7, 0 'reset to old colorsππ mainInput "", k$, 1, mt% ' get one keypressπ ' mt% contains the keycodeπ IF k$ = CHR$(13) THEN mt% = 13π oldhirow% = hirow%: oldhicol% = hicol%ππ SELECT CASE mt%π CASE 59 'F1=helpπ CALL Helpπ CLSπ keyLOOPexit% = 1 'set for inner loop exit so we canπ ' redraw the screenπ CASE 83 'deleteπ 'confirm users choiceπ 'kill fileπ 'redo directoryπ 'CASE 1024 ' mouseMoveπ 'mouse routines deleted for space.π 'CASE 1025 'left mouse button clickπ ' fake <Enter>π CASE 72 'up arrowπ IF hirow% = StartRow% THEN 'if first..start at bottom of previous colπ hirow% = virtRow%π IF hicol% > StartRow% THEN 'move to prev column if not in firstπ hicol% = hicol% - fwidth%π ELSE ' move screen back if allowedπ IF more% <> 0 AND more% <> 1 THENπ GOSUB GSdopageupπ ELSEπ hirow% = StartRow% 'stay putπ END IFπ END IFπ ELSEπ hirow% = hirow% - 1 'otherwise..go up one rowπ END IFπ CASE 80 'downarrrow% '80π IF hirow% = virtRow% THEN 'if last, start at first row next columnπ IF hicol% < (numcols% - 1) * fwidth% THEN 'if not last col go to nextπ hirow% = StartRow%π hicol% = hicol% + fwidth% '15π ELSE 'else last col move screen over if possibleπ temp1% = hirow% 'save rowπ GOSUB GSdopagedownπ IF wewentdown% = 0 THEN 'no good, save spotπ hirow% = temp1%: oldhirow% = temp1%π END IFπ END IFπ ELSEπ hirow% = hirow% + 1 'otherwise go down one colπ END IFπ CASE 75 'leftarrow% '75 'π IF hicol% > StartCol% THENπ hicol% = hicol% - fwidth% '15π ELSE 'see if another screenπ IF more% <> 1 THEN 'keep from moving if on first pageπ 'want to stay on same row for the new page..so...π 'save old row%..because GSdopageup sets it to 22π temp1% = hirow%π GOSUB GSdopageupπ 'get our row back if it changedπ hirow% = temp1%: oldhirow% = temp1%π END IFπ END IFπ CASE 77 'rightarrowπ IF hicol% < (numcols% - 1) * fwidth% THENπ hicol% = hicol% + fwidth%π ELSE 'see if another screenπ 'save old row%..because GSdopageup sets it to 1π temp1% = hirow%π GOSUB GSdopagedownπ 'do this to keep from scrolling into a blank spotπ ' in col one of the next pageπ hirow% = temp1%: oldhirow% = temp1%π END IFπ CASE 81 'page downπ 'if at top of page, set to bottomπ IF (hicol% <> maxcol% AND hirow% <> lastMaxRow%) OR (hicol% = maxcol% AND hirow% <> lastMaxRow%) THENπ hicol% = maxcol%: hirow% = lastMaxRow% ' |check for 1 col screenπ ELSE 'set to next pageπ GOSUB GSdopagedownπ END IFπ CASE 73 'page upπ 'if at bottom of page, set to top unless at top of page 1π ' in which case we stay putπ IF NOT (hirow% = StartRow% AND hicol% = StartCol%) OR (hirow% = StartRow% AND hicol% = StartCol% AND (more% = 1 OR more% = 0)) THEN 'don't askπ hirow% = StartRow%: hicol% = StartCol%π ELSE 'do a new pageπ IF more% <> 1 THEN 'this is to keep hirow%=StartRow% ,hicol%=StartCol%π ' if we are at the first pageπ GOSUB GSdopageupπ END IFπ END IFπ CASE 71 '<Home>π ' just redraw the first page, set highliteπ ' to the first file/directoryπ CLS : keyLOOPexit% = 1 'set to redrawπ hicol% = StartCol%: hirow% = StartRow%π oldhicol% = hicol%: oldhirow% = hirow%π index% = 0: oldwedidcnt% = 0π thisfile% = 1: oldthisfile% = 1π CASE 79 '<End>π CLS : keyLOOPexit% = 1 'set to redrawπ IF numFullpages% >= 1 AND numextra% <> 0 THENπ ' cover's 1 page and half pageπ index% = numFullpages% * numOnScreen%π ELSEπ IF numFullpages% <> 0 THENπ index% = filecnt% - (numFullpages% * numOnScreen%)π END IFπ END IFπ oldwedidcnt% = index%π IF numFullpages% = 0 THENπ temp2% = filecnt%π ELSEπ temp2% = numextra%π END IFπ thismanycol% = (temp2% \ numRowsIncol%)π IF (temp2% MOD numRowsIncol%) > 0 THENπ thismanycol% = thismanycol% + 1π END IFπ IF thismanycol% = 0 THENπ hicol% = StartCol%π ELSEπ hicol% = ((thismanycol% * fwidth%) - fwidth%) + StartCol%π END IFπ hirow% = ((numextra% MOD numRowsIncol%) - 1) + StartRow%π oldhirow% = hirow%: oldhicol% = hicol%π CASE 27 '<Esc> exit and abort programπ CLSπ thisfile% = 0: tag% = 0 ' zero pointer to show no choiceπ EXIT SUB '<----EXIT POINTπ CASE 13 '<Enter> 'when we exit, thisfile% is pointing to filename$(thisfile%)π numfiles% = filecnt%π CLS : keyLOOPexit% = 1: exitLOOP2flag% = 1π theBIGloopEXIT% = 1π CASE 60 '<F2> change mask$π 'works better in a message box, but anyway...π LOCATE 23, 1: PRINT SPACE$(27); 'clean off screen line for inputπ LOCATE 23, 1: mainInput "Enter new mask ", mask$, 0, mt%π IF mask$ = "" THEN mask$ = "*.*"π CLS : keyLOOPexit% = 1: exitLOOP2flag% = 1π weAlreadyDidItYN% = 0: filecnt% = 0: dircnt% = 0π CASE 320 'space bar..tag a fileπ 'if fis%() is not a dir,π IF fis%(thisfile%) = 3 THENπ tag% = tag% + 1π fis%(thisfile%) = 6π ELSEπ IF fis%(thisfile%) = 6 THENπ tag% = tag% - 1π fis%(thisfile%) = 3π END IFπ END IFπ END SELECTπ π ' calculate new file pointerπ GOSUB GScalcThisfileππ LOOP UNTIL keyLOOPexit% = 1 '════════KEY LOOPππLOOP UNTIL exitLOOP2flag% = 1ππLOOP UNTIL theBIGloopEXIT% = 1ππ'clean upπVIEW PRINT 1 TO 24πEXIT SUBππππ'SUB routinesππGSdopagedown:π wewentdown% = 0 'set to default ..noπ IF pgdwnok% = 1 THEN 'if ok to go downπ CLS : wewentdown% = 1 'show we went downπ oldwedidcnt% = wedidcnt%π oldindex% = index%π index% = wedidcnt%π hirow% = StartRow%: hicol% = StartCol% 'start out at first file onπ ' screen ie:LOCATE 1, 1π oldhirow% = hirow%: oldhicol% = hicol% 'preset old Locationsπ thisfile% = index% + 1: ' set pointerπ IF thisfile% > filecnt% THEN thisfile% = filecnt%π oldthisfile% = thisfile% 'hilight the first fileπ keyLOOPexit% = 1 'set for inner loop exit so we canπ ' redraw the screenπ END IFπRETURNπGSdopageup:π wewentup% = 0 'set to defaultπ IF pgupok% = 1 THENπ wewentup% = 1 'show we went upπ CLSπ index% = index% - numOnScreen% 'bump the index backπ oldindex% = oldindex% - numOnScreen%π oldwedidcnt% = oldwedidcnt% - numOnScreen%π 'start out at last position on pageπ 'since we are going up, the last position has to be ...π hirow% = virtRow%: hicol% = ((numcols% * fwidth%) - fwidth%) + StartCol%π oldhirow% = hirow%: oldhicol% = hicol%π thisfile% = index% + numOnScreen% '110π oldthisfile% = thisfile% 'point to the first fileπ keyLOOPexit% = 1 'set for inner loop exitπ END IFππRETURNπππGSsortfname:π' create a Quicksort SUB for speedπ' be sure and set STACK for enough roomπ' for recursive calls on 1024 filesπ' mean while.... plain old shell sortπ' courtesy of MicroSoft(C) examplesπ 'nothing new here...just make sure to sort fis%() along with filename$()πnoSwitch% = 0πOffset = (sortend% - sortStart%) \ 2πDO WHILE Offset > 0πLimit = sortend% - OffsetπDOπSwitch = noSwitch%πFOR temp1% = sortStart% TO LimitπIF filename$(temp1%) > filename$(temp1% + Offset) THENπSWAP filename$(temp1%), filename$(temp1% + Offset)πSWAP fis%(temp1%), fis%(temp1% + Offset) 'swap file isπSwitch = temp1%πEND IFπNEXT temp1%πLimit = Switch - OffsetπLOOP WHILE SwitchπOffset = Offset \ 2πLOOPππRETURNππGScalcThisfile:π ' save oldThisFile% toπ oldthisfile% = thisfile% ' save old file pointerπ thisfile% = index% + (((hicol% \ fwidth%) * 1) * numRowsIncol%) + (hirow% - (StartRow% - 1))π 'the above line is equal toπ ' SELECT CASE hicol%π ' CASE StartCol% 'column is 1π ' thisfile% = index% + (0 * numRowsInCol%) + (hirow% - (StartRow% - 1))π ' CASE fwidth% + startCol% 'column 2π ' thisfile% = index% + (1 * numRowsInCol%) + (hirow% - (StartRow% - 1)) 'x1=0 + hilited row + 22π '....etcπ ' if user tries to go to a blank area of the screenπ ' just stay where we were .. see trap for short 1 col pageπ IF thisfile% > filecnt% THENπ thisfile% = oldthisfile%π hirow% = oldhirow%: hicol% = oldhicol%π END IFππRETURNππdoname:π SELECT CASE d$π CASE "."π 'do nothingπ CASE ".."π dircnt% = dircnt% + 1π filename$(dircnt%) = CHR$(24) + " " + d$'up arrowπ fis%(dircnt%) = 1 'rootπ CASE ELSEπ dircnt% = dircnt% + 1π filename$(dircnt%) = CHR$(25) + " " + d$'downπ fis%(dircnt%) = 2 'dirπ END SELECTπRETURNππEND SUBππSUB Helpπ'πCLSπPRINT "**You can change this to use a window or something more upscale.**"πPRINT "**Just work it into your screen/window/setup**"πPRINT "Key usage...."πPRINT "<Enter> to change to directory or pick file."πPRINT "<F2> to change mask (*.*)"πPRINT "<Arrow Keys> to move from file to file or to next page."πPRINT "<Page Up> Go to top of current page or to previous page"πPRINT "<Page Down> Go to bottom of current page or to next page"πPRINT "<Home> Go to current root directory"πPRINT "<End> Go to last file on list"πPRINT "<Space Bar> Tags files in current directory"πPRINT "<Esc> Quit program"πPRINT "<F1> Help"πPRINTπmainInput "Press any key to continue...", k$, 1, mt%πππEND SUBππDEFSNG A-ZπSUB mainInput (prmpt$, cmdm2$, mode%, modet%)πmodet% = 0πSTATIC OOldrow%, Ooldcol%, cmdo$, otc%, obc%πππPRINT prmpt$; 'print promptπStartPos% = POS(0)πSTATIC cmdM$πSELECT CASE mode%πCASE 1 'GET 1 CHARACTER AND RETURNπcmdM$ = "": inef% = 0πDOπ kk$ = INKEY$π l% = LEN(kk$)π IF l% > 0 THENπ inef% = 1π IF kk$ = CHR$(27) THENπ modet% = 27π ELSEπ IF l% > 1 THENπ c$ = RIGHT$(kk$, 1)π IF c$ <> "" THENπ scan% = ASC(c$)π modet% = scan%ππ END IFπ END IFπ END IFπ END IFπLOOP UNTIL inef% = 1πcmdm2$ = UCASE$(kk$)πIF cmdm2$ = CHR$(32) THEN modet% = 320πCASE ELSE 'input a UCASE$(string$) and exit when CR,Esc or a Func key is hitπ LOCATE , , 1π cmdM$ = "": inef% = 0π GOSUB keyloopπ PRINTπ cmdm2$ = UCASE$(cmdM$)π modet% = scan%πEND SELECTππEXIT SUBππkeyloop:πDOπ kk$ = INKEY$π l% = LEN(kk$)π IF l% > 0 THENπ IF l% < 2 THENπ a% = ASC(kk$)π IF a% <> 13 THEN 'IF kk$ <> CHR$(13) THEN <Enter>π IF a% = 27 THEN 'IF kk$ = CHR$(27) THEN <Esc>π cmdm2$ = CHR$(27)π modet% = 27π EXIT SUB '<---------exit pointπ END IFπ IF a% = 8 THEN 'IF kk$ = CHR$(8) THEN 'BACK SPACE KEYπ l% = LEN(cmdM$)π IF l% > 1 THEN 'no effectπ cmdM$ = MID$(cmdM$, 1, l% - 1)π ELSEπ cmdM$ = ""π END IFπ Currow% = CSRLIN: CurCol% = POS(0)π IF CurCol% > StartPos% THEN 'locate cursor, go back one, print a spaceπ CurCol% = CurCol% - 1π LOCATE Currow%, CurCol%π PRINT " ";π LOCATE Currow%, CurCol%π END IFπ ELSEπ cmdM$ = cmdM$ + kk$π PRINT kk$;π END IFπ ELSEπ inef% = 1π scan% = 13π END IFπ ELSE 'its control characters or function keyπ c$ = RIGHT$(kk$, 1)π IF c$ <> "" THENπ scan% = ASC(c$)π inef% = 1π END IFπ END IFπ END IFπLOOP UNTIL inef% = 1πππRETURNπEND SUBππDEFINT A-ZπFUNCTION qbcurdir$π' DirLister.. (C) WASC. 1994.π' LATEAGAIN@DELPHI.COMπ π dbuffer$ = STRING$(65, CHR$(32))π 'see if drive is readyπ π 'get current driveπ regs.ax = &H1900π CALL InterruptX(&H21, regs, regs)π al% = regs.ax MOD 256π c$ = CHR$(al% + 65) + ":\" 'A:=0 B:=1 C:=2 for prev INTπ 'get directoryπ drive% = al% + 1 'A:=1 B:=2 C:=3 for this INTπ regs.ax = &H4700π regs.si = SADD(dbuffer$)π regs.ds = VARSEG(dbuffer$)π regs.dx = drive%π CALL InterruptX(&H21, regs, regs)π ecode% = regs.axπ IF ecode% THENπ zl% = INSTR(dbuffer$, CHR$(0))π qbcurdir$ = c$ + LEFT$(dbuffer$, zl% - 1)π dbuffer$ = ""π ELSEπ qbcurdir$ = ""π dbuffer$ = ""π END IFππ πEND FUNCTIONππFUNCTION qbdir$ (mode%, spec$, a%)π ' a%=32 for files 16 for directoriesπ ' a%=24 for normal files and dirsπ STATIC attrib%π SELECT CASE mode%π CASE 0π 'call with a%=24 for normanl filesπ 'Set DTA Bufferπ regs.ax = &H1A00π regs.ds = VARSEG(buffer)π regs.dx = VARPTR(buffer)π CALL InterruptX(&H21, regs, regs)π attrib = a%π CASE 1π spec$ = spec$ + CHR$(0)π regs.ax = &H4E00π regs.cx = attrib%π 'Regs.ds = SSEG(spec$) 'PDS 7.1π regs.ds = VARSEG(spec$)π regs.dx = SADD(spec$)π CALL InterruptX(&H21, regs, regs)π ecode% = regs.axπ IF ecode THENπ qbdir$ = ""π ELSEπ IF ASC(buffer.Attr) = a% THENπ zl% = INSTR(buffer.filename, CHR$(0))π qbdir$ = LEFT$(buffer.filename, zl% - 1)π ELSE 'found a match to spec$ but not to attributeπ 'and we need to return somethingπ 'recursive callπ f$ = qbdir$(2, spec$, a%)π qbdir$ = f$π END IFπ END IFπ EXIT FUNCTIONπ CASE 2 'Find next file or dirπ DOπ regs.ax = &H4F00π CALL InterruptX(&H21, regs, regs)π ecode = regs.axπ IF ecode THENπ qbdir$ = ""π EXIT FUNCTIONπ ELSEπ IF ASC(buffer.Attr) = a% THENπ zl% = INSTR(buffer.filename, CHR$(0))π qbdir$ = LEFT$(buffer.filename, zl% - 1)π EXIT FUNCTIONπ END IFπ END IFπ LOOPπ CASE 3 'Find next DIR onlyπ DOπ regs.ax = &H4F00π CALL InterruptX(&H21, regs, regs)π ecode = regs.axπ IF ecode THENπ qbdir$ = ""π EXIT FUNCTIONπ ELSEπ IF ASC(buffer.Attr) = a% THENπ zl% = INSTR(buffer.filename, CHR$(0))π qbdir$ = LEFT$(buffer.filename, zl% - 1)π EXIT FUNCTIONπ END IFπ END IFπ LOOPπ END SELECTπEXIT FUNCTIONππππEND FUNCTIONπBen Kaashoek MISC. DETECTION ROUTINES robertk@worldaccess.nl 10-28-96 (12:49) QB, PDS 242 9576 DETECT.BAS DEFINT A-Z 'Use integers as default.ππREM $INCLUDE: 'qb.bi' 'INTERRUPT include file in QB45π'REM $INCLUDE: 'qbx.bi' 'INTERRUPT include file in QBX/PDSππ'The story:π' This little piece of code started out as a simple NDOS detection routine.π' Suddenly it became a "Why-Don't-I-Put-All-My-Detection-Routines-In-Here?"π' sort of program. Anyway. Hope you can use some of it.π' I will keep adding new detection routines to this file when I find others.π' So keep your eyes PEEKing:) for new detection stuff. There are loadsπ' more out there (and somewhere around here too).π' I tried to comment as much as possible. (Is there something like TOO muchπ' when you're commenting code?)π'π' BENπ'Resources:π' - Ralph Brown's Interrupt List. I think V43 (Get your hands on it)π' A newer version will probably be released into the public domain.π' - Microsoft Windows V3.11 helpfile (Honest, it actually containedπ' something usefull. ;-) ).π' - NDOS helpfile.ππDECLARE SUB NDOSVersion (majVer%, minVer%) 'Works OK.πDECLARE SUB SMARTDRVInfo (Hits&, misses&, dirty&, majVer%, minVer%, HitRate%, oops%)πDECLARE SUB SMARTDRVSize (full%, current%, BytesPerElement!, windows%)ππDECLARE FUNCTION DetectANSI% ()πDECLARE FUNCTION DetectDOSKEY% ()πDECLARE FUNCTION DetectKSTACK% () 'Untested.πDECLARE FUNCTION DetectNDOS% () 'It detects my NDOS V7.0πDECLARE FUNCTION DetectNGUIDES% () 'Works OK.πDECLARE FUNCTION DetectNovellIPX% () 'Untested.πDECLARE FUNCTION DetectSMARTDRV% () 'Works OK.πDECLARE FUNCTION DetectXMS% () 'Works OK.πDECLARE FUNCTION PutKeysInKSTACK% (Keys$) 'Untested.ππDIM SHARED Inreg AS RegType, Outreg AS RegTypeπDIM SHARED InRegX AS RegTypeX, OutRegX AS RegTypeXππ'-------------------------- Begin demonstration ----------------------------ππCONST False = 0: True = NOT False 'Boolean constants.ππSCREEN 12: CLS : COLOR 7 'Test is independent of screenmode!πIF DetectNGUIDES THENπ PRINT "Norton Guide is resident in memory"πELSEπ PRINT "Norton Guide is not resident in memory"πEND IFππIF DetectNDOS THENπ NDOSVersion Maj%, Min%π PRINT "NDOS V"; LTRIM$(STR$(Maj%)); "."; LTRIM$(STR$(Min%)); " detected"πELSEπ PRINT "NDOS not detected"πEND IFππIF DetectNovellIPX THENπ PRINT "Novell Netware IPX driver detected"πELSEπ PRINT "Novell Netware IPX driver not detected"πEND IFππIF DetectDOSKEY THENπ PRINT "DOSKEY detected"πELSEπ PRINT "DOSKEY not detected"πEND IFππIF DetectXMS THENπ PRINT "V2.0+ XMS driver detected"πELSEπ PRINT "V2.0+ XMS driver not detected"πEND IFππIF DetectKSTACK THENπ PRINT "KSTACK.COM detected"πELSEπ PRINT "KSTACK.COM not detected"πEND IFππIF DetectANSI THENπ PRINT "ANSI.SYS detected"πELSEπ PRINT "ANSI.SYS not detected"πEND IFππIF DetectSMARTDRV THENπ SMARTDRVInfo Hits&, misses&, dirty&, majVer%, minVer%, HitRate%, oops%π PRINT "SMARTDRV V"; LTRIM$(STR$(majVer)); "."; LTRIM$(STR$(minVer)); " detected"π PRINT USING " ├─ Cache hits : #####"; Hits&π PRINT USING " ├─ Cache misses : #####"; misses&π PRINT USING " ├─ Dirty caches : #####"; dirty&π PRINT USING " ├─ Cache hitrate: ###%"; HitRate%ππ 'Notice how the hitrate only changes after disk activity.π 'Why?, that's because the drive has become a SMART drive :-).π 'Theoretically it should not exceed 100% (if it does you have aπ 'really smart one).ππ SMARTDRVSize full%, current%, BytesPerElement!, windows%π DosSize& = current% * BytesPerElement!π WinSize& = windows% * BytesPerElement!π TotalSize& = full% * BytesPerElement!π PRINT " └─ Cache sizes (bytes)"π PRINT USING " ├─ DOS = ########"; DosSize&π PRINT USING " ├─ Windows = ########"; WinSize&π PRINT " │ ----------- +"π PRINT USING " └─ Total = ########"; TotalSize&πELSEπ PRINT "SMARTDRV not detected"πEND IFπPRINT ""πCOLOR 15πPRINT "Hope you can use this. Happy keyboard crunching !"ππDO: LOOP UNTIL INKEY$ <> "" 'Wait until a key is pressed.πCOLOR 7 'Restore default MS-DOS colour.πSCREEN 0 'Restore screen (else Win95 crashes HARD)πEND 'Terminate program.ππ'---------------------------- End demonstration ----------------------------ππFUNCTION DetectANSIπInreg.AX = &H1A00 'Function 1Ah, Subfunction 0hπCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (Int 2Fh)πDetectANSI = 0 'Assume it's not thereπIF Outreg.AX \ 256 = &HFF THEN DetectANSI = -1πEND FUNCTIONππFUNCTION DetectDOSKEY%πInreg.AX = &H4800 'Function 48h, Subfunction 0hπCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (Int 2Fh)πDetectDOSKEY% = 0 'Assume it's not thereπIF Outreg.AX MOD 256 <> 0 THEN DetectDOSKEY% = -1πEND FUNCTIONππFUNCTION DetectKSTACKπInreg.AX = &HE44F 'Function E4h, Subfunction 4FhπInreg.BX = 0πCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (Int 2Fh)πDetectKSTACK = 0 'Assume it's not there.πIF Outreg.AX = &H44EE THEN DetectKSTACK = -1πEND FUNCTIONππFUNCTION DetectNDOS%πInreg.AX = &HE44D 'Function E4h, Subfunction 4DhπCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (Int 2Fh)πDetectNDOS = 0 'Assume it's not there.πIF Outreg.AX = &H44EE THEN DetectNDOS = -1πEND FUNCTIONππFUNCTION DetectNGUIDES%πInreg.AX = &HF398 'Function F3h, Subfunction 98hπCALL INTERRUPT(&H16, Inreg, Outreg) 'Call DOS (Int 16h)πDetectNGUIDES% = 0 'Assume it's not there.πIF Outreg.AX = &H6A73 THEN DetectNGUIDES% = -1πEND FUNCTIONππFUNCTION DetectNovellIPX%π'I haven't tested this routine because I don't have a network. Maybe in a fewπ'year's I can continue programming even when nature calls :-)πInreg.AX = &H7A00 'Function 7Ah, Subfunction 0hπCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (Int 2Fh)πIF Outreg.AX MOD 256 = 0 THEN DetectNovellIPX% = 0πIF Outreg.AX MOD 256 = &HFF THEN DetectNovellIPX% = -1πEND FUNCTIONππFUNCTION DetectSMARTDRV%πInreg.AX = &H4A10 'function 4Ah, Subfunction 10hπInreg.BX = 0 'Sorry, lost the info on this !πInreg.CX = &HEBAB 'Sorry, lost the info on this !πCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (Int 2fh)πDetectSMARTDRV = 0 'Assume it's not there.πIF Outreg.AX = &HBABE THEN DetectSMARTDRV = -1πEND FUNCTIONππFUNCTION DetectXMS%πInreg.AX = &H4300 'Function 43h, Subfunction 0hπCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (int 2Fh)πDetectXMS% = 0 'Assume it's not there.πIF Outreg.AX MOD 256 = &H80 THEN DetectXMS% = -1πEND FUNCTIONππSUB NDOSVersion (majVer%, minVer%)πInreg.AX = &HE44D 'Function E4h, Subfunction 4DhπCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (Int 2Fh)πmajVer% = minVer% = 0 'Return zeroes if NDOS not loaded.πIF Outreg.AX = &H44EE THEN 'Modify version if it's there.π majVer% = Outreg.BX MOD 256 'Major version in register BLπ minVer% = Outreg.BX \ 256 'Minor version in register BHπEND IFπEND SUBππFUNCTION PutKeysInKSTACK% (Keys$)π'If it doesn't work you may have to uncomment the line marked with "<---"π'and change the parameter of the VARSEG/SADD instruction.π'Many DOS functions require a Zero terminated string (ASCIIZ for short).ππ'KeysZ$ = Keys$ + CHR$(0) '<--- Uncomment this oneπInRegX.AX = &HE44F 'Function E4h, Sub-function 4FhπInRegX.BX = 1πInRegX.CX = LEN(Keys$) 'Number of keystrokes being passed.πInRegX.DS = VARSEG(Keys$) 'Segment of the keystroke string.πInRegX.DX = SADD(Keys$) 'Address of the keystroke string.πCALL INTERRUPTX(&H2F, InRegX, OutRegX) '| Int 2FhπEND FUNCTIONππSUB SMARTDRVInfo (Hits&, misses&, dirty&, majVer%, minVer%, HitRate%, oops%)πSTATIC PrevHits&, PrevTotal& 'Keep data of previous call.πInreg.AX = &H4A10 'function 4Ah, subfunction 10hπInreg.BX = 0πInreg.CX = &HEBABπCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (int 2fh)πIF Outreg.AX = &HBABE THENπ Hits& = Outreg.DX * &H100 + Outreg.BXπ misses& = Outreg.DI * &H100 + Outreg.SIπ dirty& = CLNG(Outreg.CX)π majVer% = VAL(HEX$(Outreg.BP)) \ 100π minVer% = VAL(HEX$(Outreg.BP)) - majVer * 100π oops% = 0πELSEπ oops% = -1π EXIT SUBπEND IFππ'Calculate the hitrate with the formula as found in Microsoft Windows help.π'Hit_rate = 100 * (CurrentHits - PreviousHits) / (CurrentTotal - PreviousTotal)πCurrTotal& = Hits& + misses& + dirty&πHitRate% = 100 * (Hits& - PrevHits&) / (CurrTotal& - PrevTotal&)πEND SUBππSUB SMARTDRVSize (full%, current%, BytesPerElement!, windows%)πInreg.AX = &H4A10 'function 4Ah, subfunction 10hπInreg.BX = &H4πCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (Int 2Fh)πfull% = Outreg.AX 'Size in elements of full sized cacheπcurrent% = Outreg.BX 'Current size in elementsπBytesPerElement! = Outreg.CX 'Size of one element in bytesπwindows% = Outreg.DX 'Number of elements under windowsπEND SUBπDouglas H. Lusher VGA 640X480 PANNING comp.lang.basic.misc 10-04-96 (09:52) QB, QBasic, PDS 252 8318 VGAPAN.BAS ' Greetings, fellow BASIC programmers.π' I just finished working out how to do pixel-by-pixel scrollingπ' on a VGA card and I thought that this might interest some ofπ' you, so here's a quick demo. What this code does is this: itπ' creates a virtual screen much larger than the usual SCREEN 12π' 640x480, then prints graphics to this larger virtual screen.π' When you press a key, the graphics stop being printed and youπ' can use the arrow keys to pan around and observe differentπ' parts of the virtual screen.ππ' When the VGA card sets up a screen mode, the Offset Registerπ' &H3D5, index &H13 contains the amount of display memory to beπ' used per horizontal scan line. The virtual screen is made widerπ' than the ordinary screen by increasing this value. The Startπ' Address High and Start Address Low registers, &H3D5 index &HCπ' & &HD contain the MSB and LSB respectively of the address inπ' video memory where the displayed screen begins. Increasing orπ' decreasing this value by 1 pans the screen left or right byπ' 8 pixels. Changing this value by the amount of memory per scanπ' line pans the screen up or down. Notice that horizontal panningπ' by this method alone moves the screen 8 pixels at a time. Toπ' pan horizontally a pixel at a time involves the Horizontalπ' PEL Panning register &H3C0 index &H13. Rotating the values ofπ' this register from 0 through 7 pans the screen pixel-column π' by pixel-column. Note that this register must only be changedπ' during a vertical retrace and that an INP(&H3DA) command mustπ' preceed a change to this register. Also, bit 5 must always beπ' set.ππ' It is worth noting also that the normal BASIC graphics commandsπ' will not work on the larger virtual screen, so I have providedπ' my own code to create the graphics in this demo. While the codeπ' for these graphics commands is good, it is just BASIC and is π' not necessarily optimised, so I realized that it is slow. Thatπ' particular aspect is not the focus of this demo.ππ DECLARE SUB QPrint (X%, Y%, Text$, Culler%)π DECLARE SUB DrawCircle (X%, Y%, Radius%, Culler%)π DECLARE SUB PutPixel (X%, Y%, Culler%)π DECLARE SUB DrawLine (X1%, Y1%, X2%, Y2%, Culler%)π DEFINT A-Zπ REDIM BitMask%(0 TO 7)π Mask% = 128π FOR Bit% = 0 TO 7π BitMask%(Bit%) = Mask%: Mask% = Mask% \ 2π NEXTππ RANDOMIZE TIMERπ SCREEN 12: ScrnWid% = 640: ScrnHgt% = 480ππ 'the width of the virtual screen in pixels:π VScrnWid% = 832π 'In SCREEN 12, the following must be true:π ' VScrnWid% must be equal to or greater than 640π ' VScrnWid% must be less than or equal to 1088π ' VScrnWid% must be evenly divisible by 16π HPanLimit% = VScrnWid% - ScrnWid%π BytesPerLine% = VScrnWid% \ 8ππ 'the height of the virtual screen in pixels:π VScrnHgt% = 624π 'In SCREEN 12, the following must be true:π ' VScrnHgt% must be equal to or greater than 480π ' VScrnHgt% must be less than or equal to 819π ' The product of VScrnHgt% multiplied by VScrnWid% must be lessπ ' than or equal to 524288π VPanLimit% = VScrnHgt% - ScrnHgt%ππ 'create the virtual screen:π OUT &H3D4, &H13: OUT &H3D5, VScrnWid% \ 16ππ 'put up some graphicsπ MinX% = 0: MaxX% = VScrnWid% - 1π MinY% = 0: MaxY% = VScrnHgt% - 1π CALL DrawLine(MinX%, MinY%, MaxX%, MinY%, 1)π CALL DrawLine(MaxX%, MinY%, MaxX%, MaxY%, 2)π CALL DrawLine(MaxX%, MaxY%, MinX%, MaxY%, 3)π CALL DrawLine(MinX%, MaxY%, MinX%, MinY%, 4)ππ RR% = VScrnHgt%: IF VScrnWid% < VScrnHgt% THEN RR% = VScrnWid%π DO UNTIL LEN(INKEY$)π X1% = INT(RND * VScrnWid%)π Y1% = INT(RND * VScrnHgt%)π X2% = INT(RND * VScrnWid%)π Y2% = INT(RND * VScrnHgt%)π C% = INT(RND * 14) + 1π CALL DrawLine(X1%, Y1%, X2%, Y2%, C%)π R% = INT(RND * (RR% \ 4))π X1% = INT(RND * (VScrnWid% - R% * 2)) + R%π Y1% = INT(RND * (VScrnHgt% - R% * 2)) + R%π C% = INT(RND * 14) + 1π CALL DrawCircle(X1%, Y1%, R%, C%)π LOOPπ CALL QPrint(8, 8, "Upper Left", 15)π CALL QPrint(VScrnWid% - 96, 8, "Upper Right", 15)π CALL QPrint(8, VScrnHgt% - 16, "Lower Left", 15)π CALL QPrint(VScrnWid% - 96, VScrnHgt% - 16, "Lower Right", 15)ππ 'allow the user to pan around the virtual screenπ X% = 0: Y% = 0π DOπ DO WHILE LEN(INKEY$): LOOPπ DO: KP$ = INKEY$: LOOP UNTIL LEN(KP$)π KP% = ASC(KP$): IF KP% = 0 THEN KP% = -ASC(MID$(KP$, 2))π SELECT CASE KP%π CASE 27π EXIT DOπ CASE 52, -75 'Four, LArrowπ IF X% > 0 THENπ X% = X% - 1π DO: LOOP WHILE (INP(&H3DA) AND 8) = 0π OUT &H3C0, &H33: OUT &H3C0, X% MOD 8π ELSEπ BEEPπ END IFπ CASE 54, -77 'Six, RArrowπ IF X% < HPanLimit% THENπ X% = X% + 1π DO: LOOP WHILE (INP(&H3DA) AND 8) = 0π OUT &H3C0, &H33: OUT &H3C0, X% MOD 8π ELSEπ BEEPπ END IFπ CASE 56, -72 'Eight, UpArrowπ IF Y% > 0 THENπ Y% = Y% - 1π ELSEπ BEEPπ END IFπ CASE 50, -80 'Two, DnArrowπ IF Y% < VPanLimit% THENπ Y% = Y% + 1π ELSEπ BEEPπ END IFπ END SELECTπ Ptr% = (Y% * BytesPerLine%) + (X% \ 8)π OUT &H3D4, &HD: OUT &H3D5, Ptr% MOD 256π OUT &H3D4, &HC: OUT &H3D5, Ptr% \ 256π LOOPπ SCREEN 0: WIDTH 80π ENDππ SUB DrawCircle (X%, Y%, Radius%, Culler%)π 'a routine to draw circles using only integers and integer mathπ 'an implementation of Bresenham's algorithmπ 'by Douglas H. Lusher, 05-09-1996π A% = 0π B% = Radius%π D% = (1 - Radius%) * 2π XX1% = X%: YY1% = Y% + B%π XX2% = X%: YY2% = Y% - B%π XY1% = X% + B%: YX1% = Y%π XY2% = X% - B%: YX2% = Y%π DO WHILE B% >= A%π CALL PutPixel(XX1%, YY1%, Culler%)π CALL PutPixel(XX1%, YY2%, Culler%)π CALL PutPixel(XX2%, YY1%, Culler%)π CALL PutPixel(XX2%, YY2%, Culler%)π CALL PutPixel(XY1%, YX1%, Culler%)π CALL PutPixel(XY1%, YX2%, Culler%)π CALL PutPixel(XY2%, YX1%, Culler%)π CALL PutPixel(XY2%, YX2%, Culler%)π IF D% + B% > 0 THENπ B% = B% - 1π D% = D% - (B% * 2) + 1π YY1% = YY1% - 1: YY2% = YY2% + 1π XY1% = XY1% - 1: XY2% = XY2% + 1π END IFπ IF A% > D% THENπ A% = A% + 1π D% = D% + (A% * 2) + 1π XX1% = XX1% + 1: XX2% = XX2% - 1π YX1% = YX1% + 1: YX2% = YX2% - 1π END IFπ LOOPπ END SUBπ π SUB DrawLine (X1%, Y1%, X2%, Y2%, Culler%)π 'a routine to draw lines using only integers and integer mathπ 'an implementation of Bresenham's algorithmπ 'by Douglas H. Lusher, 05-08-1996π A% = X2% - X1%π B% = Y2% - Y1%π DX2% = 1: DY2% = 1π IF A% < 0 THEN A% = -A%: DX2% = -1π IF B% < 0 THEN B% = -B%: DY2% = -1π DX1% = DX2%: DY1% = 0π IF A% < B% THEN SWAP A%, B%: DX1% = 0: DY1% = DY2%π I1% = B% * 2π D% = I1% - A%π I2% = D% - A%π X% = X1%: Y% = Y1%π FOR I% = 0 TO A%π CALL PutPixel(X%, Y%, Culler%)π IF D% < 0 THENπ X% = X% + DX1%π Y% = Y% + DY1%π D% = D% + I1%π ELSEπ X% = X% + DX2%π Y% = Y% + DY2%π D% = D% + I2%π END IFπ NEXTπ END SUBππ SUB PutPixel (X%, Y%, Culler%)π SHARED BitMask%(), BytesPerLine%π DEF SEG = &HA000π Offset& = (CLNG(Y%) * BytesPerLine%) + (X% \ 8)π OUT &H3CE, 5: OUT &H3CF, 2π OUT &H3CE, 8: OUT &H3CF, BitMask%(X% AND 7)π Byte% = PEEK(Offset&): POKE Offset&, Culler%π END SUBππ SUB QPrint (X%, Y%, Text$, Culler%)π 'this routine uses the VGA hardware to print textπ ' in 16 color graphics modesπ 'by Douglas H. Lusher, 06-08-1996π SHARED BytesPerLine%ππ ' 8 x 8 char box, CGAπ CharSegment% = &HFFA6: CharOffset% = &HE: CharHgt% = 8ππ ' 8 x 16 char box, VGAπ 'DIM Regs AS RegTypeXπ 'Regs.AX = &H1130π 'Regs.BX = &H600π 'CALL InterruptX(&H10, Regs, Regs)π 'CharSegment% = Regs.ES: CharOffset% = Regs.BP: CharHgt% = 16ππ REDIM BitPattern%(1 TO CharHgt%)π Temp& = (CLNG(Y%) * BytesPerLine%) + (X% \ 8)π VideoSegment% = &HA000 + (Temp& \ 16)π VideoOffset% = (Temp& MOD 16) - 1π OUT &H3CE, 5: OUT &H3CF, 2: OUT &H3CE, 8π FOR Char% = 1 TO LEN(Text$)π Ptr% = CharHgt% * ASC(MID$(Text$, Char%, 1)) + CharOffset% - 1π DEF SEG = CharSegment%π FOR Ln% = 1 TO CharHgt%π BitPattern%(Ln%) = PEEK(Ptr% + Ln%)π NEXTπ VideoPtr% = VideoOffset% + Char%π DEF SEG = VideoSegment%π FOR Ln% = 1 TO CharHgt%π OUT &H3CF, BitPattern%(Ln%)π Byte% = PEEK(VideoPtr%): POKE VideoPtr%, Culler%π VideoPtr% = VideoPtr% + BytesPerLine%π NEXTπ NEXTπ END SUBπTika Carr GUI LIBRARY V1.23 W/DOCS itaiya@juno.com 10-25-96 (14:07) QB, PDS 380 11252 GUI123.BAS ===================== GUI Interface Programmer's Library v 1.23 DocsπGUI Interface Programmer's Library v. 1.23 for QuickBasic 4.5 8/9/96πCopyright 1996 by Tika CarrππThese routines use the QB.QLB library. I put everything you need into oneπfile, which is also a demo of some of the things that the GUI routines can do.ππCALL Mouse(x) x = 0 Initialize Mouse, 1 Show Mouse, 2 Hide Mouse,π3 Get mouse informationππYou MUST CALL Mouse(0) to start the mouse. Then CALL Mouse(1) to showπthe mouse. mx, my is the mouse coordinates and mb is the mouse button,πif you use CALL Mouse(3). These are global variables defined in GUI.BI.ππCALL gprint ("Text", x, y, color)ππThis routine lets you print text on screen according to pixel location. Putπthe Text in quotes. X and Y are Pixel locations, not LOCATE locations, so youπcan go x up to 640 and Y up to 480. color is from 0 to 15 (standard VGAπcolors). See GUI.BI for more info on Palettes and Colors.ππButtons, Pop Up Menus, Frames, Check Boxes, Radio Buttons:ππCALL drwbtn (style, color, frame offset, frame color, x1, y1, x2, y2)π | | | | | |π -------- --------------- -------------π Inside Outside Coordinatesπ of button/frame of frameππ3-D Push Buttons:ππStyle 1 and Style 2 are for making those push buttons like "OK" orπ"Escape", etc. Style 1 is a pushed in button, and Style 2 is a normalπbutton.ππCALL drwbtn(1, 3, 0, 0, 3, 3, 55, 18) 'Button is pushed (selected).πCALL drwbtn(2, 3, 0, 0, 75, 3, 121, 18) 'Button is not pushed.ππNote that the frame offset and color values are not used for push buttons.ππFramed Pop-Ups:ππThere are four styles of framed popup type windows that give a 3-Dπlook:ππCALL drwbtn(3, 6, 10, 5, 3, 25, 103, 125) 'Frame Style 3 (On/Off)πCALL drwbtn(4, 3, 10, 2, 110, 25, 210, 125) 'Frame Style 4 (Off/On)πCALL drwbtn(5, 8, 10, 7, 220, 25, 320, 125) 'Frame Style 5 (On/On)πCALL drwbtn(6, 11, 10, 10, 340, 25, 440, 125)'Frame Style 6 (Off/Off)ππStyle 3: Inlaid frame with embossed interior.πStyle 4: Embossed frame with inlaid interior.πStyle 5: Inlaid frame and interior.πStyle 6: Embossed frame and interior.ππNote that we used an offset of 10 in the above 4 examples. This givesπus a nice frame boarder. You can set this at any size in pixels thatπyou wish. The color value after style is the color of the interior andπthe color value after frame offset is the color of the surroundingπframe. The other values are the upper left and lower right corners ofπthe entire pop up.ππCheck Boxes:ππStyles 7 and 8 create check boxes:ππCALL drwbtn(7, 4, 0, 0, 3, 135, 18, 150) 'Plain Check BoxπCALL drwbtn(8, 4, 0, 0, 23, 135, 38, 150) 'Plain Check Box CheckedππNote again that the frame values are not used.ππRadio Buttons:ππRadio buttons use the values a bit differently from the others. They are:ππdrwbtn(style, color, radius, center mark color, x, y, nul, nul)ππStyles 9 and 10 provide you with the standard circular radio buttons:ππCALL drwbtn(9, 9, 8, 0, 50, 143, 0, 0) 'Radio ButtonπCALL drwbtn(10, 9, 8, 15, 70, 143, 0, 0) 'Radio Button OnππThe center mark color is the color of the dot that goes in the centerπof a selected radio button. Only the x and y coordinates are needed,πand the other x and y parameters are 0 (not used).ππPopup Input Box:ππ(New for Version 1.23)ππPopInp(Prompt$, T2Len, x1, y1, CurClr)ππPrompt$ is what you'd like to ask the user. T2Len is the maximumπamount of characters you will allow in the input field. x1 and y1 are theπupper left corner coordinates. CurClr is the color of the cursor.ππExample:ππCALL PopInp("Do You Really Want To Quit?", 1, 160, 120, 3)ππI think I'll stop here with the GUI project, due to the fact I just don't haveπtime to develop it much further. Of course, anyone is invited to add to it.πHopefully this was a start. This code is usable by anyone who wishes, as longπas they give credit to the proper people in their program code and in theπon-screen of the finished product (ie. in an "About" menu). The code in thisπlibrary is not for commercial use.ππTika Carr 1:2613/601ππCREDITS: All routines written by Tika Carr, except the GPrint routine,πwhich was written by Douglas Lusher.πππ================= GUI Interface Programmer's Library v. 1.23 Source Codeπ'GUI123.BAS 8/9/96π'GUI Interface Programmer's Library v. 1.23π'for QuickBasic 4.5π'Copyright 1996 by Tika Carrππ'Contact:π'Tika Carr 1:2613/601π'kari@rochgte.fidonet.orgππDECLARE SUB clrscrn (clr%)πDECLARE SUB drwbtn (ds%, dc%, dfs%, dfc%, dx1%, dy1%, dx2%, dy2%)πDECLARE SUB gprint (z$, x%, y%, c%)πDECLARE SUB Mouse (a%)πDECLARE SUB PopInp (Prompt$, T2Len%, x1%, y1%, CurClr%)ππ'$INCLUDE: 'qb.bi'ππCOMMON SHARED mb%, mi%, mt%, mx%, my% 'mouse variablesπCOMMON SHARED black%, white% 'used for paletteπCOMMON SHARED T2$ 'PopInp resultsπDIM SHARED Inregs AS RegType, Outregs AS RegType 'InterruptπDIM SHARED Regs AS RegTypeX 'InterruptXππSCREEN 12: CLS '640 x 480 16 color VGA 80 x 30 textππ'** PALETTE ASSIGNMENT **ππ' Color 0 and Color 15 are system colors (black and white) and shouldπ' not be changed as they are used for buttons and such.ππblack% = 0: white% = 15ππDEFINT A-ZππWIDTH 80, 60ππ'Clear the screen to color #3 (Cyan)πCALL clrscrn(3)ππ'Change white to be 7, causing the boarder highlight to be greyπ'instead of white. Change the menu bar to be white, then draw menuπ'bar, and change white back to color #14 (white)ππwhite = 7πCALL drwbtn(2, 15, 0, 0, 0, 0, 639, 20)πwhite = 15ππ'The "Exit" box in the upper left.πCALL drwbtn(2, 7, 0, 0, 2, 2, 18, 18)πCALL gprint("X", 6, 4, 0)ππ'The "Help" box in the upper right.πCALL drwbtn(2, 7, 0, 0, 619, 2, 637, 18)πCALL gprint("?", 624, 4, 0)ππ'Menu OptionsπCALL gprint("File", 55, 3, 0)πCALL gprint("Edit", 107, 3, 0)ππ' A boxed frame text boxπCALL drwbtn(4, 9, 10, 1, 10, 30, 629, 459)ππ' Some text in the boxπa$(1) = "Here is an example of some things you can do in the GUI interface."πa$(2) = "I want to thank Douglas H. Lusher for his help in writing the gprint"πa$(3) = "routine. He developed a faster way to print text on the screen. This"πa$(4) = "routine does what the PRINT statement can't: Prints text virtually"πa$(5) = "anywhere on the screen, and transparently over the graphics."ππy = 34πFOR g = 1 TO 5π y = y + g + 16π CALL gprint(a$(g), 32, y, 14)πNEXT gππStart:π'Loop to trap mouse eventsπCALL Mouse(0) 'initialize mouseπCALL Mouse(1) 'show mouseπWHILE mb = 0 'trap eventsπ CALL Mouse(3)π LOCATE 60, 1π PRINT mx, my, mb;πWENDππ'The "Exit" box in the upper left clicked on.πIF mx > 2 AND my > 3 AND mx < 18 AND my < 18 THENπ CALL Mouse(2) 'hide mouseπ CALL drwbtn(1, 7, 0, 0, 2, 2, 18, 18)π CALL gprint("X", 6, 4, 0)π FOR delay = 1 TO 30000: NEXTπ CALL drwbtn(2, 7, 0, 0, 2, 2, 18, 18)π CALL gprint("X", 6, 4, 0)π CALL PopInp("Do You Really Want To Quit?", 1, 160, 120, 3)π IF LCASE$(T2$) = "n" THEN RUN ELSE ENDπEND IFππGOTO StartππSUB clrscrn (clr%)πLINE (0, 0)-(639, 479), clr%, BFπEND SUBππSUB drwbtn (ds, dc, dfs, dfc, dx1, dy1, dx2, dy2)πIF ds >= 3 AND ds <= 6 THEN c = dfc ELSE c = dcπSELECT CASE dsπ CASE 1: GOSUB dOnπ CASE 2: GOSUB dOffπ CASE 3: GOSUB dOn: GOSUB Inside: GOSUB dOffπ CASE 4: GOSUB dOff: GOSUB Inside: GOSUB dOnπ CASE 5: GOSUB dOn: GOSUB Inside: GOSUB dOnπ CASE 6: GOSUB dOff: GOSUB Inside: GOSUB dOffπ CASE 7: GOSUB Dsquπ CASE 8: π GOSUB Dsquπ LINE (dx1, dy1)-(dx2, dy2), black%π LINE (dx1, dy2)-(dx2, dy1), black%π CASE 9: GOSUB Dcirπ CASE 10:π GOSUB Dcirπ CIRCLE (dx1, dy1), (15 - dfs) \ 2, dfcπ PAINT (dx1, dy1), dfc, dfcπEND SELECTππGOTO DdoneππDsqu:π LINE (dx1, dy1)-(dx2, dy2), black%, Bπ PAINT (dx2 - 4, dy2 - 4), c, black%πRETURNππDBold:π GOSUB Dsquπ LINE (dx1 + 1, dy1 + 1)-(dx2 - 1, dy2 - 1), black%, BπRETURNππdOn:π GOSUB DBoldπ LINE (dx1 + 1, dy2 - 1)-(dx2 - 1, dy2 - 1), white%π LINE -(dx2 - 1, dy1 + 1), white%πRETURNππdOff:π GOSUB DBoldπ LINE (dx1 + 1, dy2 - 1)-(dx1 + 1, dy1 + 1), white%π LINE -(dx2 - 1, dy1 + 1), white%πRETURNππDcir:π CIRCLE (dx1, dy1), dfs, black%π PAINT (dx1, dy1), dc, black%πRETURNππInside:π dx1 = dx1 + dfs: dy1 = dy1 + dfsπ dx2 = dx2 - dfs: dy2 = dy2 - dfsπ c = dcπRETURNππDdone:πdx1 = dx1 - dfs: dy1 = dy1 - dfsπdx2 = dx2 + dfs: dy2 = dy2 + dfsππEND SUBππSUB gprint (z$, x%, y%, c%)πRegs.ax = &H1130πRegs.bx = &H600πCALL INTERRUPTX(&H10, Regs, Regs)πCharSegment% = Regs.es: CharOffset% = Regs.bpπCharWid% = 8: CharHgt% = 16ππDEF SEG = CharSegment%πXX% = xπFOR Char% = 1 TO LEN(z$)π Ptr% = CharHgt% * ASC(MID$(z$, Char%, 1)) + CharOffset%π FOR Ln% = 0 TO CharHgt% - 1π BitPattern& = PEEK(Ptr% + Ln%) * 256&π LineFormat% = (BitPattern& - 32768) XOR -32768π LINE (XX%, y + Ln%)-STEP(CharWid% - 1, 0), c, , LineFormat%π NEXTπ XX% = XX% + CharWid%πNEXTπDEF SEGπEND SUBππSUB Mouse (a%)πInregs.ax = a%πCALL INTERRUPT(&H33, Inregs, Outregs)πmb = Outregs.bx 'button 0 = off 1 = left 2 = rightπmx = Outregs.cx 'x coordinateπmy = Outregs.dx 'y coordinateπmi = Outregs.ax 'init (dummer variable)ππEND SUBππDEFSNG A-ZπSUB PopInp (Prompt$, T2Len%, x1%, y1%, CurClr%)ππIF LEN(Prompt$) > T2Len% THEN PBoxLen = LEN(Prompt$) ELSE PBoxLen = T2Len%πx2% = x1% + (PBoxLen + 2) * 8: y2% = y1% + 64: nx = x1%: ny = y1%ππCALL Mouse(2)πBitsPerPixel = 1: planes = 4 'Screen Mode 12πAry% = 4 + INT(((x2% - x1% + 1) * (BitsPerPixel) + 7) / 8) * planes * ((y2% - y1%) + 1)ππDIM VScreen(1 TO Ary%)πGET (x1%, y1%)-(x2%, y2%), VScreenππCALL drwbtn(2, 7, 0, 0, x1%, y1%, x2%, y2%)πx1% = x1% + 8πCALL gprint(Prompt$, x1%, y1% + 8, 0)ππInloop:πy1% = y1% + 32π'Input FieldπCALL gprint(">", x1%, y1%, 0)πCALL gprint(STRING$(T2Len%, 219), x1% + 8, y1%, 15)ππ'** Turn on and show cursorπx1% = x1% + 8πcursor$ = CHR$(219)πCALL gprint(cursor$, x1%, y1%, 4)ππ'** Get Input and move cursorππT2$ = ""π1 T1$ = INKEY$: IF T1$ = "" THEN 1 'wait for keypressπst = ASC(T1$)ππ'Backspace and eraseππIF st = 8 THENπ 'checks to make sure its in fieldπ x1% = x1% - 8: IF x1% < nx + 16 THEN x1% = nx + 16: GOTO 1π CALL gprint(cursor$, x1% + 8, y1%, 15)π CALL gprint(RIGHT$(T2$, 1), x1%, y1%, 0)π CALL gprint(cursor$, x1%, y1%, 4)π 'subtracts deleted character from stringπ IF LEN(T2$) >= 1 THEN T2$ = LEFT$(T2$, LEN(T2$) - 1)π GOTO 1πEND IFππIF T1$ = CHR$(13) THEN GOTO 2 'End of input when ENTER is pressed.ππIF st < 32 OR st > 127 THEN BEEP: GOTO 1 'check for illegal characterππ'Character ok, add to string, move cursorππT2$ = T2$ + T1$πCALL gprint(cursor$, x1%, y1%, 15)πCALL gprint(T1$, x1%, y1%, 0)πx1% = x1% + 8π'checks to make sure its in fieldπIF x1% > (nx + T2Len% * 8 + 8) THEN BEEP: GOTO 1πCALL gprint(cursor$, x1%, y1%, 4)ππ'Get more inputπGOTO 1ππ2 'Erase menu, restore what was underneathπPUT (nx, ny), VScreen, PSETπERASE VScreenπCALL Mouse(1)ππEND SUBπKurt Kuzba SUBROUTINE & FUNCTION USAGE FidoNet QUIK_BAS Echo 10-06-96 (22:08) QB, QBasic, PDS 92 4523 SUBTUTOR.BAS'> What is the difference between SUBs and FUNCTIONS?π'>.........π'_|_|_| SUBTUTOR.BASπ'_|_|_| A short tutorial on SUB and FUNCTION usage.π'_|_|_| No warrantee or guarantee is given or implied.π'_|_|_| Released PUBLIC DOMAIN by Kurt Kuzba. (10/6/96)πCOLOR 15, 1: CLSπPRINT " This is a short tutorial on use of SUB and FUNCTION in QBasic"πPRINT " and Quick Basic. It explores some of the relationships of"πPRINT " variables between modules. By studying the code and following"πPRINT " with the text, one may grasp module concepts."πPRINT " Variables in a SUB or FUNCTION, unless declared as STATIC,"πPRINT " are AUTOMATIC variables. BASIC initializes them every time"πPRINT " the module containing them is called. They may have the same"πPRINT " name as variables in other modules without confusion."πPRINT " SHARED and PASSED variables will be examined. Ready?"πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " We will begin with the SUB. Variables may be passed by SEG or"πPRINT " or by VAL. Variables enclosed in parentheses are passed by VALue."πPRINT " FUNCTION variables must be enclosed in a group parentheses, and"πPRINT " we may also use VAL parentheses. First, we will pass by VALue."πPRINT : MyStr$ = "This won't be changed.": MySub (MyStr$)πPRINT " MyStr$ = "; MyStr$: PRINTπPRINT " As you can see, MyStr$ is unchanged"πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " Now we will pass by SEGment.": PRINTπMyStr$ = "This will be changed."πMySub MyStr$: PRINT " MyStr$ = "; MyStr$: PRINTπPRINT " Since the ADDRESS of MyStr$ was passed, the SUB was"πPRINT " able to change the contents of the variable."πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " Now we will use a FUNCTION and pass by VALue.": PRINTπMyStr$ = "This won't be changed.": FuncStr$ = MyFunc((MyStr$)):πPRINT " MyFunc$ = "; FuncStr$: PRINT " MyStr$ = "; MyStr$: PRINTπPRINT " As a result, MyStr$ is unchanged, and a new string is created."πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " Now we will pass MyStr$ by SEGment.": PRINTπMyStr$ = "This will be changed.": FuncStr$ = MyFunc(MyStr$):πPRINT " MyFunc$ = "; FuncStr$: PRINT " MyStr$ = "; MyStr$: PRINTπPRINT " We still got the new string, but now MyStr$ has changed!"πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " Unlike subroutines using GOSUB, variables found in the"πPRINT " MAIN module are unknown in the SUB or FUNCTION routines."πPRINT " This is known as the SCOPE of a variable. In order for a"πPRINT " variable to be VISIBLE to a SUB or FUNCTION, it must be"πPRINT " declared as being SHARED, or be passed as an argument."πDO: LOOP WHILE INKEY$ = "": PRINTπMyStr$ = "This is MyStr$.": MyShare: PRINT " MyStr$ = "; MyStr$: PRINTπPRINT " This way, variables are available to your SUB or FUNCTION."πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " In addition, we may declare variables SHARED in the main"πPRINT " module by use of the DIM statement.": PRINTπDIM OurStr AS STRING * 32: OurStr = "This is a shared string."πMySub OurStr: PRINT " OurStr = "; OurStr: PRINTπPRINT " So here we see that this string is shared in the SUB."πDO: LOOP WHILE INKEY$ = "": PRINTπPRINT " If we were to pass a fixed length string as an argument,"πPRINT " then the contents of the string would be passed and not the"πPRINT " string itself, although, if that string were passed by SEGment,"πPRINT " then whatever changes were made to the passed string would be"πPRINT " stored in the fixed string when we exit the SUB or FUNCTION."πDIM FixedStr AS STRING * 10: FixedStr = "A string"πPRINT " FixedStr = "; FixedStr: Fixed FixedStrπPRINT " FixedStr = "; FixedStr: PRINTπPRINT " The SUB string is a temporary dynamic string created by the SUB"πPRINT " and truncated to fit into the fixed length string."πDO: LOOP WHILE INKEY$ = "": PRINTπPRINT " I hope this answers most of your questions concerning"πPRINT " the use of SUBs and FUNCTIONs in QBasic and Quick Basic."πDO: LOOP WHILE INKEY$ = "": COLOR 2, 0: CLSπ'_|_|_| end SUBTUTOR.BASππSUB Fixed (p$)π PRINT " (passed string)p$ = "; p$π p$ = "This string is way too big for FixedStr."π PRINT " (passed string)p$ = "; p$πEND SUBππFUNCTION MyFunc$ (p$)π PRINT " (passed variable)p$ = "; p$: p$ = "changed"π MyFunc$ = "This is an entirely new string!"πEND FUNCTIONππSUB MyShareπ SHARED MyStr$: PRINT " SHARED variable MyStr$ = "; MyStr$π MyStr$ = "This variable, being SHARED, may be changed."πEND SUBππSUB MySub (p$)π PRINT " (passed variable)p$ = "; p$: p$ = "changed"πEND SUBππAndrew L. Ayers GET/PUT INFO. FOR VGA MODE 13H andrewa@indirect.com 09-09-96 (00:00) Text 342 15018 GETPUT13.TXT-----------------------------------------------------------------------------π Mode 13 VGA (320x200x256) GET/PUT Information and Techniquesππ By Andrew L. Ayers - September 9th, 1996ππ-----------------------------------------------------------------------------ππThe following is what I have found out through trial and error (as well asπa bit of logical guesswork). While I have found it to work on every machineπI have tried it with, do not assume it is so for your machine. Instead, pro-πceed with caution. While none of this should cause major problems (ie. I doπnot believe it will trash your machine or anything), a wrong step could causeπyour machine to lock up, forcing you to reboot. Anyway, this is intended forπinformational purposes only. I cannot be held responsible for the use/abuseπof the information contained herein, nor can I be held responsible for anyπdamage done to the person or the machine on which the examples contained inπthis document are run upon. Just the standard disclaimer to CMA!ππIf you find this information useful, and choose to include the techniques inπyour own code, please be kind and mention my name. You don't have to do thisπ(hell, if I mentioned everyone's name I have learned from, that list would beπa mile long!), but it would be nice.ππI wish to thank Jason Grooms - for guiding my first steps into the wonderfulπworld of assembler (back then, 6809), and to Brent Dill, for showing me howπto do strange and crazy stuff with GET/PUT, and a host of other tips. Brent,πif your read this, contact me. I'm on the 'Net. I know you are worth yourπsalt to find me. L8r!ππ=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=ππCalculating the buffer size for GET/PUT in mode 13:ππ1. Take the width of the area you are getting (in pixels) and multiply itπ by the height (in lines). This will give you the total number of bytesπ in the area for the buffer.ππ2. Find the total number of WORDs to use by dividing the number of bytes byπ two. We need the total number of WORDs because the smallest variable typeπ we can use is an integer, which is WORD size (2 bytes).ππ3. We now have the amount of space needed to store the area we want to GET.π But BASIC needs a couple of more pieces of information in order for GETπ and PUT to operate correctly. These two pieces of information are theπ width and the height of the image! It needs these two items in order forπ the PUT routine to know when to stop drawing. So, the width and theπ height of the image area must be stored with the image data itself. Theseπ two values are placed into their own WORDs at the start of the buffer. Weπ must add on two WORDs to accomodate this.ππ4. We now have the total number of WORDs needed to DIMension an integer arrayπ to hold our image data. Because the base of the array starts at zero, weπ will subtract one from our total number of WORDs to DIMension our array:ππ DIM buffer%(# of WORDs)ππ5. Our buffer data layout looks like so:ππ WORD DESCRIPTIONπ ---- --------------------------------------------------π 0 Width, contained in the high byte of the WORD.π This value is in bits (!), and so must be dividedπ by 8 to find out the number of pixels (bytes).π 1 Height, contained in the high byte of the WORD.π Value in number of lines.π 2 Start of data...π .π .π .π XX End of data...ππExample:ππ1. We have a 16x16 sprite. So we need 256 bytes in order to hold an area thisπ big.ππ2. We need the number of WORDs, so we divide by 2, giving us 128 WORDs.ππ3. We add two words to accomodate the width and height values needed by PUT,π giving us a total of 130 WORDs.ππ4. We subtract 1, and dimension our array:ππ DIM buffer%(129)ππ5. Our buffer data layout looks like so:ππ WORD DESCRIPTIONπ ---- --------------------------------------------------π 0 Width, contained in the high byte of the WORD.π This value is in bits (!), and so must be dividedπ by 8 to find out the number of pixels (bytes).π 1 Height, contained in the high byte of the WORD.π Value in number of lines.π 2 Start of data...π .π .π .π 129 End of data...ππ=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=ππMultiple Image Buffers for GET/PUT:ππWhat was shown above was an example for a simple buffer to hold a singleπimage to be used in GET/PUT. Using the above simple example, we would just do theπfollowingππ GET(0,0)-(15,15),buffer%π PUT(100,100),buffer%,PSETππin order to GET/PUT a single simple image. But what if we needed 30 spritesπ(say for a game)? We could do thisππ DIM buffer1%(129), buffer2%(129),...,buffer30%(129)ππthen use GET/PUT to move everything around, but this is wasteful, and notπvery easy to work with. What if we wanted animation? What then?ππFortunately, there is an easy way out, using what is called offsetting. Weπhave a buffer of a set size we are GETing and PUTing with. What isn't beingπshown is what is called the offset. An offset is a number added to a fixedπvalue to obtain a new start value. When we dimension an array, the start ofπthat array is obtained and kept by BASIC (we can use VARSEG and VARPTR toπfind it if we wanted to). If we say DIM a%(20), then say a%(2)=15, we haveπused an offset of 2 from the start of the array and placed 15 at that pos-πition in memory. A similar thing is done by GET/PUT. Note the following:ππ DIM buffer%(129)π GET(0,0)-(15,15),buffer%ππis the same as:ππ DIM buffer%(129)π GET(0,0)-(15,15),buffer%(0)ππWe just didn't use the offset of zero in the first example! What would happenπif we did the following?:ππ DIM buffer%(129)π GET(0,0)-(15,15),buffer%(10)ππWe would get an error. This is because we need 130 WORDs of space for theπarea we are trying to GET, and we only have a total of 130 WORDs to playπwith. By trying to put an offset of 10 into the mix, we overrun the end ofπthe array by 10 WORDs! The following would work:ππ DIM buffer%(139)π GET(0,0)-(15,15),buffer%(10)ππNow WORD number 10 would hold our width and WORD number 11 our height, andπ12 through 139 would hold our data. We could then PUT(100,100),buffer%(10),PSETπand everything would work fine. Now what would happen if we PUT(100,100),πbuffer%(0),PSET? We would either get an error or garbage, because PUT wouldn'tπhave the correct width and height info in the first two WORDs! So, we needπto keep track of the size so we know what offsets we can use when GETing andπPUTing our images.ππOur example is a 16x16 sprite. We would like to have 30 of these for ourπultra cool game we are writing. We need 130 WORDs for each of these spritesπ(2 for width/height, 128 for data), and we want 30 sprites, so we need aπbuffer that is 3900 WORDs long (130 WORDs x 30 sprites). We know that everyπ130 WORDs is a new sprite, so that will be our offset. If we set our offsetπto 0, then we are on the first sprite, 130 is the second, 260 is the third,πand so on. The following shows how:ππ DIM sprite%(3899)π spritenum%=2π GET(0,0)-(15,15),sprite%(spritenum%*130)π spritenum%=5π PUT(100,100),sprite%(spritenum%*130),PSETππBefore you can put a sprite, you obviously need to GET it, so that PUT hasπthe width/height info to work with. So lines 4 and 5 wouldn't work in ourπexample unless we changed line 2 to "spritenum%=5".ππWe now have an easy way to GET/PUT a whole mess of sprites on the screenπusing a single buffer that is easily accessible. We could do simple animationπwith this system. Say our first five sprites were already in the buffer andπthey were an animation of some type. To flip through them, we would do theπfollowing:ππ FOR spritenum%=0 TO 4π PUT(100,100),sprite%(spritenum%*130),PSETπ NEXT spritenum%ππIt is that easy.ππOur buffer layout now looks like this, for those interested:ππ WORD DESCRIPTIONπ ---- --------------------------------------------------π 0 Width, contained in the high byte of the WORD.π This value is in bits (!), and so must be dividedπ by 8 to find out the number of pixels (bytes).π 1 Height, contained in the high byte of the WORD.π Value in number of lines.π 2 Start of sprite0 data...π .π .π .π 129 End of sprite0 data...ππ 130 Width, contained in the high byte of the WORD.π This value is in bits (!), and so must be dividedπ by 8 to find out the number of pixels (bytes).π 131 Height, contained in the high byte of the WORD.π Value in number of lines.π 132 Start of sprite1 data...π .π .π .π 259 End of sprite1 data...ππ 260 Width, contained in the high byte of the WORD.π This value is in bits (!), and so must be dividedπ by 8 to find out the number of pixels (bytes).π 261 Height, contained in the high byte of the WORD.π Value in number of lines.π 262 Start of sprite2 data...π .π .π .π 389 End of sprite2 data...ππAnd so on...ππThe only other thing you need to keep in mind is buffer size versus spriteπsize. As noted before, a 16x16 sprite needs 130 WORDs in order to store itπcompletely in an array. When you have multiple sprites in an array, thereπis a limit to the size of your array you can have. This limit is 64K - 65536πbytes, or 32768 WORDs. To find out how many sprites you can store in a singleπarray, divide 32768 by the number of WORDs required for each sprite. Drop anyπvalues after the decimal (that is, take the integer, drop the remainder), andπthis is the maximum number of sprites you can store. For our example of aπ16x16 sprite (130 WORDs), this works out to be 252 sprites. Take that numberπand multiple by the number of WORDs per sprite, subtracting 1, to use forπDIMensioning the array: DIM buffer%(32759).ππThe following table breaks down common sprite sizes and array dimensions:ππ Sprite Size Number Array Size (in WORDs)π ----------- ------ ---------------------------------π 8 x 8 963 34 for sprite, 32741 for arrayπ 16 x 16 252 130 for sprite, 32759 for arrayπ 32 x 32 63 514 for sprite, 32381 for arrayπ 64 x 64 15 2050 for sprite, 30749 for arrayππIf you need more sprites, you can split them over two arrays. Animation andπsuch becomes more difficult to handle, but it can be done. ππAlso remember, the larger the sprite, the more data the computer has to shoveπaround. Stay away from the 64 x 64 sprites, except for maybe big bosses orπsuch. These things are memory HOGS. The only other limit to be aware of isπQBASIC's 160K limit on program AND code size. One buffer of sprites (252πsprites) will eat almost 64K, leaving you with less than 100K to put theπrest of your code in! QuickBASIC and PowerBASIC users shouldn't have anyπproblem though. Some of these problems may be overcome by using EMS routinesπto shove the sprite data into extended memory, though.ππ=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=ππGETing and PUTing without The BOX:ππIf you have ever used GET and PUT, you know that when you PUT, a "box" isπleft around your image obliterating anything under and around your sprite.πThis looks very ugly and unprofessional in a game. The following shows theπbest way to get rid of this problem, using a method called sprite masking.ππ1. First, for each and every sprite you create, create a "mask" for it. Thisπ mask is the same size and shape as the original sprite, only it consistsπ of only two colors, 0 and 255 (or &H0 and &HFF for you hex folks). Colorπ all visible portions of the sprite (those portions you want to obscureπ the background) with color 0. Color all invisible portions of the spriteπ (those protions you want the background to show through) with color 255.π Remember, you need one mask for each sprite, and this will knock yourπ sprite count down by half, so keep it in mind when designing your game.ππ2. To display your sprite, simply PUT the mask image down using the AND op-π erator, then place the sprite image down using the OR operator. The ANDπ and OR operators are called bitwise boolean operators, and have theπ following truth tables:ππ AND ORπ ------------------- -------------------π IN1 IN2 OUT IN1 IN2 OUTπ ------------------- -------------------π 0 0 0 0 0 0π 1 0 0 1 0 1π 0 1 0 0 1 1π 1 1 1 1 1 1ππ These tables basically mean the following. If you take two bits and ANDπ or OR them together, the result equals a 1 or a 0 depending on the inputsπ and the relationship between them in the truth tables for the operator inπ question. If you understand this - read on. If you understand this andπ are 10 - 14 years old, you don't need college (just kidding ;).ππ Now, for what we are doing, we have a background of different byte valuesπ (which consist of a series of bits). Our mask only has two values in it,π the byte 0 (00000000 in binary) and the byte 255 (11111111 in binary).π Let me show you how the magic works:ππ A. Our Background Image AND Mask = Resultππ 11110110 11111111 11110110π 11110110 11000011 11000010π 11110110 11000011 11000010π 11110110 11000011 11000010π 11110110 11111111 11110110ππ B. Our Result OR Sprite = Resultππ 11110110 00000000 11110110π 11000010 00111100 11222210π 11000010 00111100 11222210π 11000010 00111100 11222210π 11110110 00000000 11110110ππ If you notice, I have used 2s in place of 1s on the final result to showπ the example better. Those 2s should really be 1s, so don't let that throwπ you. Suffice to say, if you look carefully, we have placed our 8 x 5π sprite on the background, without the border showing.ππ=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=ππGETing and PUTing without The BOX, method 2:ππThe next best way to GET and PUT without the box showing, is to simply notπdraw those pixels in the first place. The only way to do that (short of mod-πifying BASIC itself) is to write your own PUT routine, to skip over any pixelπof a defined color (0 in our case). This would have two advantages: Numberπone, your sprite could be drawn faster because you only set the pixels youπneed, and number two, you wouldn't double your buffer requirements for πsprites because you would only need the sprites, and could eliminate theπmasks! All sounds good until you try to write the thing in BASIC...it isπhorribly slow (ok, on a fast system, it runs at an acceptable pace). The onlyπway to get around this is to code it in a lower level language (or at leastπone that can compile down to a faster version). I have done this, and youπcan find the results of my labor in the ABC Packets. It is called the Blast!πlibrary. It allows you to do the above, and much more. Check it out!ππMike Kristopert VIDEO POKER /SiliconValley/Park/6165/ 07-25-96 (23:45) QB, QBasic, PDS 853 21110 VIDPOK.BAS DECLARE SUB getpress ()πpoker:πbet = 0πmoney = 10000πpoker2:πRANDOMIZE TIMERπCLSπPRINT ""πPRINT " ** Video Poker **"πPRINT "==========================================================="πPRINT ""πPRINT " Your current bet is $"; betπPRINT ""πPRINT " [1] Bet (required)"πPRINT " [2] View Payouts"πPRINT " [3] Deal Cards"πPRINT " [4] Quit"πPRINT " (answer using number)"πDOπINPUT " ? ", vidpoker%πLOOP UNTIL vidpoker% > 0 AND vidpoker% < 5πIF vidpoker% = 4 THEN ENDπplacebet:πIF vidpoker% = 1 THENπ CLSπ PRINT ""π PRINT " ** Video Poker **"π PRINT "==========================================================="π PRINT ""π PRINT " Maximum bet of $ 1000"π PRINT " You only have $"; moneyπ INPUT " How much would you like to bet? $", betπ IF bet > money THEN PRINT "": PRINT " You don't have that much.": bet = 0: getpress: GOTO placebetπ IF bet > 1000 THEN PRINT " That is over the maximum bet.": bet = 0: getpress: GOTO placebetπ GOTO poker2πEND IFπππIF vidpoker% = 2 THENπ CLSπ PRINT " ** Video Poker **"π PRINT "==========================================================="π PRINT ""π PRINT " Payouts"π IF bet = 0 THEN PRINT "": PRINT " You must place a bet first.": getpress: GOTO poker2π PRINT ""π PRINT " Five of a kind ... $"; (bet * 1000)π PRINT " Royal Flush ...... $"; (bet * 400)π PRINT " Straight Flush ... $"; (bet * 200)π PRINT " Four of a kind ... $"; (bet * 100)π PRINT " Full House ....... $"; (bet * 30)π PRINT " Flush ............ $"; (bet * 20)π PRINT " Straight ......... $"; (bet * 10)π PRINT " Three of a kind .. $"; (bet * 5)π PRINT " Two Pair ......... $"; (bet * 3)π PRINT " Jacks or better .. $"; betπ getpressπ GOTO poker2πEND IFππIF bet = 0 THENπ CLSπ PRINT ""π PRINT " ** Video Poker **"π PRINT "==========================================================="π PRINT ""π PRINT " You Must Place a bet first."π getpressπ GOTO poker2πEND IFππpkrdeal:πCOLOR 7, 0πCLSπPRINT ""πPRINT " ** Video Poker **"πPRINT "==========================================================="πPRINT " (Aces are high)"πPRINT ""πPRINT ""πPRINT ""πPRINT ""πPRINT ""πPRINT " 1 2 3 4 5"πPRINT ""πPRINT " Type the number of the cards you want to Hold"πPRINT " Then [Space] to deal"πFOR dealcard# = 1 TO 7000: NEXT dealcard#πacard% = INT(RND * 13)πast% = INT(RND * 4)πIF ast% = 0 THEN acardst$ = ""πIF ast% = 1 THEN acardst$ = ""πIF ast% = 2 THEN acardst$ = ""πIF ast% = 3 THEN acardst$ = ""πbcard% = INT(RND * 13)πbst% = INT(RND * 4)πIF bst% = 0 THEN bcardst$ = ""πIF bst% = 1 THEN bcardst$ = ""πIF bst% = 2 THEN bcardst$ = ""πIF bst% = 3 THEN bcardst$ = ""πccard% = INT(RND * 13)πcst% = INT(RND * 4)πIF cst% = 0 THEN ccardst$ = ""πIF cst% = 1 THEN ccardst$ = ""πIF cst% = 2 THEN ccardst$ = ""πIF cst% = 3 THEN ccardst$ = ""πdcard% = INT(RND * 13)πdst% = INT(RND * 4)πIF dst% = 0 THEN dcardst$ = ""πIF dst% = 1 THEN dcardst$ = ""πIF dst% = 2 THEN dcardst$ = ""πIF dst% = 3 THEN dcardst$ = ""πecard% = INT(RND * 13)πest% = INT(RND * 4)πIF est% = 0 THEN ecardst$ = ""πIF est% = 1 THEN ecardst$ = ""πIF est% = 2 THEN ecardst$ = ""πIF est% = 3 THEN ecardst$ = ""ππdealem1:πIF acard% = 0 THEN acard$ = "2"πIF acard% = 1 THEN acard$ = "3"πIF acard% = 2 THEN acard$ = "4"πIF acard% = 3 THEN acard$ = "5"πIF acard% = 4 THEN acard$ = "6"πIF acard% = 5 THEN acard$ = "7"πIF acard% = 6 THEN acard$ = "8"πIF acard% = 7 THEN acard$ = "9"πIF acard% = 8 THEN acard$ = "10"πIF acard% = 9 THEN acard$ = "J"πIF acard% = 10 THEN acard$ = "Q"πIF acard% = 11 THEN acard$ = "K"πIF acard% = 12 THEN acard$ = "A"ππIF bcard% = 0 THEN bcard$ = "2"πIF bcard% = 1 THEN bcard$ = "3"πIF bcard% = 2 THEN bcard$ = "4"πIF bcard% = 3 THEN bcard$ = "5"πIF bcard% = 4 THEN bcard$ = "6"πIF bcard% = 5 THEN bcard$ = "7"πIF bcard% = 6 THEN bcard$ = "8"πIF bcard% = 7 THEN bcard$ = "9"πIF bcard% = 8 THEN bcard$ = "10"πIF bcard% = 9 THEN bcard$ = "J"πIF bcard% = 10 THEN bcard$ = "Q"πIF bcard% = 11 THEN bcard$ = "K"πIF bcard% = 12 THEN bcard$ = "A"ππIF ccard% = 0 THEN ccard$ = "2"πIF ccard% = 1 THEN ccard$ = "3"πIF ccard% = 2 THEN ccard$ = "4"πIF ccard% = 3 THEN ccard$ = "5"πIF ccard% = 4 THEN ccard$ = "6"πIF ccard% = 5 THEN ccard$ = "7"πIF ccard% = 6 THEN ccard$ = "8"πIF ccard% = 7 THEN ccard$ = "9"πIF ccard% = 8 THEN ccard$ = "10"πIF ccard% = 9 THEN ccard$ = "J"πIF ccard% = 10 THEN ccard$ = "Q"πIF ccard% = 11 THEN ccard$ = "K"πIF ccard% = 12 THEN ccard$ = "A"ππIF dcard% = 0 THEN dcard$ = "2"πIF dcard% = 1 THEN dcard$ = "3"πIF dcard% = 2 THEN dcard$ = "4"πIF dcard% = 3 THEN dcard$ = "5"πIF dcard% = 4 THEN dcard$ = "6"πIF dcard% = 5 THEN dcard$ = "7"πIF dcard% = 6 THEN dcard$ = "8"πIF dcard% = 7 THEN dcard$ = "9"πIF dcard% = 8 THEN dcard$ = "10"πIF dcard% = 9 THEN dcard$ = "J"πIF dcard% = 10 THEN dcard$ = "Q"πIF dcard% = 11 THEN dcard$ = "K"πIF dcard% = 12 THEN dcard$ = "A"ππIF ecard% = 0 THEN ecard$ = "2"πIF ecard% = 1 THEN ecard$ = "3"πIF ecard% = 2 THEN ecard$ = "4"πIF ecard% = 3 THEN ecard$ = "5"πIF ecard% = 4 THEN ecard$ = "6"πIF ecard% = 5 THEN ecard$ = "7"πIF ecard% = 6 THEN ecard$ = "8"πIF ecard% = 7 THEN ecard$ = "9"πIF ecard% = 8 THEN ecard$ = "10"πIF ecard% = 9 THEN ecard$ = "J"πIF ecard% = 10 THEN ecard$ = "Q"πIF ecard% = 11 THEN ecard$ = "K"πIF ecard% = 12 THEN ecard$ = "A"ππ'displays the cardsππCOLOR 7, 0πLOCATE 5, 9πPRINT "███████"πLOCATE 6, 9πPRINT "███████"πLOCATE 7, 9πPRINT "███████"πLOCATE 8, 9πPRINT "███████"πLOCATE 9, 9πPRINT "███████"πIF ast% < 2 THEN COLOR 4, 15πIF ast% > 1 THEN COLOR 0, 15πLOCATE 6, 10πPRINT acard$πIF acard$ = "10" THEN LOCATE 8, 13: PRINT acard$: ELSE LOCATE 8, 14: PRINT acard$πLOCATE 7, 12πPRINT acardst$πFOR dealcard# = 1 TO 7000: NEXT dealcard#ππCOLOR 7, 0πLOCATE 5, 18πPRINT "███████"πLOCATE 6, 18πPRINT "███████"πLOCATE 7, 18πPRINT "███████"πLOCATE 8, 18πPRINT "███████"πLOCATE 9, 18πPRINT "███████"πIF bst% < 2 THEN COLOR 4, 15πIF bst% > 1 THEN COLOR 0, 15πLOCATE 6, 19πPRINT bcard$πIF bcard$ = "10" THEN LOCATE 8, 22: PRINT bcard$: ELSE LOCATE 8, 23: PRINT bcard$πLOCATE 7, 21πPRINT bcardst$πFOR dealcard# = 1 TO 7000: NEXT dealcard#ππCOLOR 7, 0πLOCATE 5, 27πPRINT "███████"πLOCATE 6, 27πPRINT "███████"πLOCATE 7, 27πPRINT "███████"πLOCATE 8, 27πPRINT "███████"πLOCATE 9, 27πPRINT "███████"πIF cst% < 2 THEN COLOR 4, 15πIF cst% > 1 THEN COLOR 0, 15πLOCATE 6, 28πPRINT ccard$πIF ccard$ = "10" THEN LOCATE 8, 31: PRINT ccard$: ELSE LOCATE 8, 32: PRINT ccard$πLOCATE 7, 30πPRINT ccardst$πFOR dealcard# = 1 TO 7000: NEXT dealcard#ππCOLOR 7, 0πLOCATE 5, 36πPRINT "███████"πLOCATE 6, 36πPRINT "███████"πLOCATE 7, 36πPRINT "███████"πLOCATE 8, 36πPRINT "███████"πLOCATE 9, 36πPRINT "███████"πIF dst% < 2 THEN COLOR 4, 15πIF dst% > 1 THEN COLOR 0, 15πLOCATE 6, 37πPRINT dcard$πIF dcard$ = "10" THEN LOCATE 8, 40: PRINT dcard$: ELSE LOCATE 8, 41: PRINT dcard$πLOCATE 7, 39πPRINT dcardst$πFOR dealcard# = 1 TO 7000: NEXT dealcard#ππCOLOR 7, 0πLOCATE 5, 45πPRINT "███████"πLOCATE 6, 45πPRINT "███████"πLOCATE 7, 45πPRINT "███████"πLOCATE 8, 45πPRINT "███████"πLOCATE 9, 45πPRINT "███████"πIF est% < 2 THEN COLOR 4, 15πIF est% > 1 THEN COLOR 0, 15πLOCATE 6, 46πPRINT ecard$πIF ecard$ = "10" THEN LOCATE 8, 49: PRINT ecard$: ELSE LOCATE 8, 50: PRINT ecard$πLOCATE 7, 48πPRINT ecardst$ππkeepa$ = "no"πkeepb$ = "no"πkeepc$ = "no"πkeepd$ = "no"πkeepe$ = "no"πππDOπholdcard$ = INKEY$πIF holdcard$ = CHR$(49) THENπ IF keepa$ = "yes" THENπ LOCATE 10, 9π COLOR 7, 0π PRINT " 1 "π keepa$ = "no"π ELSEπ LOCATE 10, 9π COLOR 4, 0π PRINT "[HELD]"π keepa$ = "yes"π END IFπEND IFππIF holdcard$ = CHR$(50) THENπ IF keepb$ = "yes" THENπ LOCATE 10, 18π COLOR 7, 0π PRINT " 2 "π keepb$ = "no"π ELSEπ LOCATE 10, 18π COLOR 4, 0π PRINT "[HELD]"π keepb$ = "yes"π END IFπEND IFππIF holdcard$ = CHR$(51) THENπ IF keepc$ = "yes" THENπ LOCATE 10, 27π COLOR 7, 0π PRINT " 3 "π keepc$ = "no"π ELSEπ LOCATE 10, 27π COLOR 4, 0π PRINT "[HELD]"π keepc$ = "yes"π END IFπEND IFππIF holdcard$ = CHR$(52) THENπ IF keepd$ = "yes" THENπ LOCATE 10, 36π COLOR 7, 0π PRINT " 4 "π keepd$ = "no"π ELSEπ LOCATE 10, 36π COLOR 4, 0π PRINT "[HELD]"π keepd$ = "yes"π END IFπEND IFππIF holdcard$ = CHR$(53) THENπ IF keepe$ = "yes" THENπ LOCATE 10, 45π COLOR 7, 0π PRINT " 5 "π keepe$ = "no"π ELSEπ LOCATE 10, 45π COLOR 4, 0π PRINT "[HELD]"π keepe$ = "yes"π END IFπEND IFππLOOP WHILE holdcard$ <> CHR$(32)ππFOR dealstop# = 1 TO 7000: NEXT dealstop#ππIF keepa$ = "no" THENπ acard% = INT(RND * 13)π ast% = INT(RND * 4)π IF ast% = 0 THEN acardst$ = ""π IF ast% = 1 THEN acardst$ = ""π IF ast% = 2 THEN acardst$ = ""π IF ast% = 3 THEN acardst$ = ""π COLOR 7, 0π LOCATE 5, 9π PRINT " "π LOCATE 6, 9π PRINT " "π LOCATE 7, 9π PRINT " "π LOCATE 8, 9π PRINT " "π LOCATE 9, 9π PRINT " "π FOR dealstop# = 1 TO 5000: NEXT dealstop#π IF acard% = 0 THEN acard$ = "2"π IF acard% = 1 THEN acard$ = "3"π IF acard% = 2 THEN acard$ = "4"π IF acard% = 3 THEN acard$ = "5"π IF acard% = 4 THEN acard$ = "6"π IF acard% = 5 THEN acard$ = "7"π IF acard% = 6 THEN acard$ = "8"π IF acard% = 7 THEN acard$ = "9"π IF acard% = 8 THEN acard$ = "10"π IF acard% = 9 THEN acard$ = "J"π IF acard% = 10 THEN acard$ = "Q"π IF acard% = 11 THEN acard$ = "K"π IF acard% = 12 THEN acard$ = "A"π COLOR 7, 0π LOCATE 5, 9π PRINT "███████"π LOCATE 6, 9π PRINT "███████"π LOCATE 7, 9π PRINT "███████"π LOCATE 8, 9π PRINT "███████"π LOCATE 9, 9π PRINT "███████"π IF ast% < 2 THEN COLOR 4, 15π IF ast% > 1 THEN COLOR 0, 15π LOCATE 6, 10π PRINT acard$π IF acard$ = "10" THEN LOCATE 8, 13: PRINT acard$: ELSE LOCATE 8, 14: PRINT acard$π LOCATE 7, 12π PRINT acardst$π FOR dealcard# = 1 TO 7000: NEXT dealcard#πEND IFππIF keepb$ = "no" THENπ bcard% = INT(RND * 13)π bst% = INT(RND * 4)π IF bst% = 0 THEN bcardst$ = ""π IF bst% = 1 THEN bcardst$ = ""π IF bst% = 2 THEN bcardst$ = ""π IF bst% = 3 THEN bcardst$ = ""π COLOR 7, 0π LOCATE 5, 18π PRINT " "π LOCATE 6, 18π PRINT " "π LOCATE 7, 18π PRINT " "π LOCATE 8, 18π PRINT " "π LOCATE 9, 18π PRINT " "π FOR dealstop# = 1 TO 5000: NEXT dealstop#π IF bcard% = 0 THEN bcard$ = "2"π IF bcard% = 1 THEN bcard$ = "3"π IF bcard% = 2 THEN bcard$ = "4"π IF bcard% = 3 THEN bcard$ = "5"π IF bcard% = 4 THEN bcard$ = "6"π IF bcard% = 5 THEN bcard$ = "7"π IF bcard% = 6 THEN bcard$ = "8"π IF bcard% = 7 THEN bcard$ = "9"π IF bcard% = 8 THEN bcard$ = "10"π IF bcard% = 9 THEN bcard$ = "J"π IF bcard% = 10 THEN bcard$ = "Q"π IF bcard% = 11 THEN bcard$ = "K"π IF bcard% = 12 THEN bcard$ = "A"π COLOR 7, 0π LOCATE 5, 18π PRINT "███████"π LOCATE 6, 18π PRINT "███████"π LOCATE 7, 18π PRINT "███████"π LOCATE 8, 18π PRINT "███████"π LOCATE 9, 18π PRINT "███████"π IF bst% < 2 THEN COLOR 4, 15π IF bst% > 1 THEN COLOR 0, 15π LOCATE 6, 19π PRINT bcard$π IF bcard$ = "10" THEN LOCATE 8, 22: PRINT bcard$: ELSE LOCATE 8, 23: PRINT bcard$π LOCATE 7, 21π PRINT bcardst$π FOR dealcard# = 1 TO 7000: NEXT dealcard#πEND IFππIF keepc$ = "no" THENπ ccard% = INT(RND * 13)π cst% = INT(RND * 4)π IF cst% = 0 THEN ccardst$ = ""π IF cst% = 1 THEN ccardst$ = ""π IF cst% = 2 THEN ccardst$ = ""π IF cst% = 3 THEN ccardst$ = ""π COLOR 7, 0π LOCATE 5, 27π PRINT " "π LOCATE 6, 27π PRINT " "π LOCATE 7, 27π PRINT " "π LOCATE 8, 27π PRINT " "π LOCATE 9, 27π PRINT " "π FOR dealstop# = 1 TO 5000: NEXT dealstop#π IF ccard% = 0 THEN ccard$ = "2"π IF ccard% = 1 THEN ccard$ = "3"π IF ccard% = 2 THEN ccard$ = "4"π IF ccard% = 3 THEN ccard$ = "5"π IF ccard% = 4 THEN ccard$ = "6"π IF ccard% = 5 THEN ccard$ = "7"π IF ccard% = 6 THEN ccard$ = "8"π IF ccard% = 7 THEN ccard$ = "9"π IF ccard% = 8 THEN ccard$ = "10"π IF ccard% = 9 THEN ccard$ = "J"π IF ccard% = 10 THEN ccard$ = "Q"π IF ccard% = 11 THEN ccard$ = "K"π IF ccard% = 12 THEN ccard$ = "A"π COLOR 7, 0π LOCATE 5, 27π PRINT "███████"π LOCATE 6, 27π PRINT "███████"π LOCATE 7, 27π PRINT "███████"π LOCATE 8, 27π PRINT "███████"π LOCATE 9, 27π PRINT "███████"π IF cst% < 2 THEN COLOR 4, 15π IF cst% > 1 THEN COLOR 0, 15π LOCATE 6, 28π PRINT ccard$π IF ccard$ = "10" THEN LOCATE 8, 31: PRINT ccard$: ELSE LOCATE 8, 32: PRINT ccard$π LOCATE 7, 30π PRINT ccardst$π FOR dealcard# = 1 TO 7000: NEXT dealcard#πEND IFππIF keepd$ = "no" THENπ dcard% = INT(RND * 13)π dst% = INT(RND * 4)π IF dst% = 0 THEN dcardst$ = ""π IF dst% = 1 THEN dcardst$ = ""π IF dst% = 2 THEN dcardst$ = ""π IF dst% = 3 THEN dcardst$ = ""π COLOR 7, 0π LOCATE 5, 36π PRINT " "π LOCATE 6, 36π PRINT " "π LOCATE 7, 36π PRINT " "π LOCATE 8, 36π PRINT " "π LOCATE 9, 36π PRINT " "π FOR dealstop# = 1 TO 5000: NEXT dealstop#π IF dcard% = 0 THEN dcard$ = "2"π IF dcard% = 1 THEN dcard$ = "3"π IF dcard% = 2 THEN dcard$ = "4"π IF dcard% = 3 THEN dcard$ = "5"π IF dcard% = 4 THEN dcard$ = "6"π IF dcard% = 5 THEN dcard$ = "7"π IF dcard% = 6 THEN dcard$ = "8"π IF dcard% = 7 THEN dcard$ = "9"π IF dcard% = 8 THEN dcard$ = "10"π IF dcard% = 9 THEN dcard$ = "J"π IF dcard% = 10 THEN dcard$ = "Q"π IF dcard% = 11 THEN dcard$ = "K"π IF dcard% = 12 THEN dcard$ = "A"π COLOR 7, 0π LOCATE 5, 36π PRINT "███████"π LOCATE 6, 36π PRINT "███████"π LOCATE 7, 36π PRINT "███████"π LOCATE 8, 36π PRINT "███████"π LOCATE 9, 36π PRINT "███████"π IF dst% < 2 THEN COLOR 4, 15π IF dst% > 1 THEN COLOR 0, 15π LOCATE 6, 37π PRINT dcard$π IF dcard$ = "10" THEN LOCATE 8, 40: PRINT dcard$: ELSE LOCATE 8, 41: PRINT dcard$π LOCATE 7, 39π PRINT dcardst$π FOR dealcard# = 1 TO 7000: NEXT dealcard#πEND IFππIF keepe$ = "no" THENπ ecard% = INT(RND * 13)π est% = INT(RND * 4)π IF est% = 0 THEN ecardst$ = ""π IF est% = 1 THEN ecardst$ = ""π IF est% = 2 THEN ecardst$ = ""π IF est% = 3 THEN ecardst$ = ""π COLOR 7, 0π LOCATE 5, 45π PRINT " "π LOCATE 6, 45π PRINT " "π LOCATE 7, 45π PRINT " "π LOCATE 8, 45π PRINT " "π LOCATE 9, 45π PRINT " "π FOR dealstop# = 1 TO 5000: NEXT dealstop#π IF ecard% = 0 THEN ecard$ = "2"π IF ecard% = 1 THEN ecard$ = "3"π IF ecard% = 2 THEN ecard$ = "4"π IF ecard% = 3 THEN ecard$ = "5"π IF ecard% = 4 THEN ecard$ = "6"π IF ecard% = 5 THEN ecard$ = "7"π IF ecard% = 6 THEN ecard$ = "8"π IF ecard% = 7 THEN ecard$ = "9"π IF ecard% = 8 THEN ecard$ = "10"π IF ecard% = 9 THEN ecard$ = "J"π IF ecard% = 10 THEN ecard$ = "Q"π IF ecard% = 11 THEN ecard$ = "K"π IF ecard% = 12 THEN ecard$ = "A"π COLOR 7, 0π LOCATE 5, 45π PRINT "███████"π LOCATE 6, 45π PRINT "███████"π LOCATE 7, 45π PRINT "███████"π LOCATE 8, 45π PRINT "███████"π LOCATE 9, 45π PRINT "███████"π IF est% < 2 THEN COLOR 4, 15π IF est% > 1 THEN COLOR 0, 15π LOCATE 6, 46π PRINT ecard$π IF ecard$ = "10" THEN LOCATE 8, 49: PRINT ecard$: ELSE LOCATE 8, 50: PRINT ecard$π LOCATE 7, 48π PRINT ecardst$π FOR dealcard# = 1 TO 7000: NEXT dealcard#πEND IFππDOπtempa% = acard%πtempb% = bcard%πtempc% = ccard%πtempd% = dcard%πtempe% = ecard%πacard% = tempb%πbcard% = tempc%πccard% = tempd%πdcard% = tempe%πecard% = tempa%πLOOP UNTIL acard% <= bcard% AND acard% <= ccard% AND acard% <= dcard% AND acard% <= ecard%πππDOπtempb% = bcard%πtempc% = ccard%πtempd% = dcard%πtempe% = ecard%πbcard% = tempc%πccard% = tempd%πdcard% = tempe%πecard% = tempb%πLOOP UNTIL bcard% <= ccard% AND bcard% <= dcard% AND bcard% <= ecard%π πDOπtempc% = ccard%πtempd% = dcard%πtempe% = ecard%πccard% = tempd%πdcard% = tempe%πecard% = tempc%πLOOP UNTIL ccard% <= dcard% AND ccard% <= ecard%π πDOπtempd% = dcard%πtempe% = ecard%πdcard% = tempe%πecard% = tempd%πLOOP UNTIL dcard% <= ecard%ππIF acard% = bcard% AND acard% = ccard% AND acard% = dcard% AND acard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Five of a kind, you win $"; (bet * 1000)π money = money + (bet * 1000)π GOTO payupπEND IFππIF acard% = 8 AND bcard% = 9 AND ccard% = 10 AND dcard% = 11 AND ecard% = 12 AND acardst$ = bcardst$ AND acardst$ = ccardst$ AND acardst$ = dcardst$ AND acardst$ = ecardst$ THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Royal Flush, you win $"; (bet * 400)π money = money + (bet * 400)π GOTO payupπEND IFππIF ecard% = 1 + dcard% AND dcard% = 1 + ccard% AND ccard% = 1 + bcard% AND bcard% = 1 + acard AND ast% = bst% AND ast% = cst% AND ast% = dst% AND ast% = est% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Straight Flush, you win $"; (bet * 200)π money = money + (bet * 200)π GOTO payupπEND IFππIF acard% = bcard% AND acard% = ccard% AND acard% = dcard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Four of a kind, you win $"; (bet * 100)π money = money + (bet * 100)π GOTO payupπEND IFππIF bcard% = ccard% AND bcard% = dcard% AND bcard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Four of a kind, you win $"; (bet * 100)π money = money + (bet * 100)π GOTO payupπEND IFππIF acard% = bcard% AND acard% = ccard% AND dcard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Full House, you win $"; (bet * 30)π money = money + (bet * 30)π GOTO payupπEND IFππIF acard% = bcard% AND ccard% = dcard% AND ccard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Full House, you win $"; (bet * 30)π money = money + (bet * 30)π GOTO payupπEND IFππIF ast% = bst% AND ast% = cst% AND ast% = dst% AND ast% = est% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Flush, you win $"; (bet * 20)π money = money + (bet * 20)π GOTO payupπEND IFππIF ecard% = 1 + dcard% AND dcard% = 1 + ccard% AND ccard% = 1 + bcard% AND bcard% = 1 + acard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Straight, you win $"; (bet * 10)π money = money + (bet * 10)π GOTO payupπEND IFππIF acard% = bcard% AND acard% = ccard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Three of a kind, you win $"; (bet * 5)π money = money + (bet * 5)π GOTO payupπEND IFππIF bcard% = ccard% AND bcard% = dcard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Three of a kind, you win $"; (bet * 5)π money = money + (bet * 5)π GOTO payupπEND IFππIF ccard% = dcard% AND ccard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Three of a kind, you win $"; (bet * 5)π money = money + (bet * 5)π GOTO payupπEND IFππIF acard% = bcard% AND ccard% = dcard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Two Pair, you win $"; (bet * 3)π money = money + (bet * 3)π GOTO payupπEND IFππIF acard% = bcard% AND dcard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Two Pair, you win $"; (bet * 3)π money = money + (bet * 3)π GOTO payupπEND IFππIF bcard% = ccard% AND dcard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Two Pair, you win $"; (bet * 3)π money = money + (bet * 3)π GOTO payupπEND IFππIF acard% = bcard% THENπ IF acard% > 8 THENπ LOCATE 15, 18π COLOR 7, 0π PRINT "Jacks or Better, you win $"; betπ GOTO payupπ END IFπEND IFππIF bcard% = ccard% THENπ IF bcard% > 8 THENπ LOCATE 15, 18π COLOR 7, 0π PRINT "Jacks or Better, you win $"; betπ GOTO payupπ END IFπEND IFππIF ccard% = dcard% THENπ IF ccard% > 8 THENπ LOCATE 15, 18π COLOR 7, 0π PRINT "Jacks or Better, you win $"; betπ GOTO payupπ END IFπEND IFππIF dcard% = ecard% THENπ IF dcard% > 8 THENπ LOCATE 15, 18π COLOR 7, 0π PRINT "Jacks or Better, you win $"; betπ GOTO payupπ END IFπEND IFππLOCATE 15, 18πCOLOR 7, 0πPRINT "You lose your bet of $"; betπmoney = money - betππpayup:πLOCATE 17, 15πPRINT "Deal again to bet the same amount"πgetpressπGOTO poker2ππSUB getpressπDOπa$ = INKEY$πLOOP UNTIL a$ <> ""πEND SUBππAdam Stanchos RED BARON 2573 pages.prodigy.com/gamersp 04-06-96 (00:00) QB, QBasic, PDS 1282 48034 REDBARON.BAS'For best play performance, compile Red Baron into an .EXE!π'Reply with any comments or questions and enjoy the game! π'Red Baron 2573. Programmed by Adam Stanchos π'On Prodigy: TCMP46B On AOL: AdamS60982 πDECLARE SUB Sunset (rxpos%, rypos%)πDECLARE SUB ExtraShipCheck (Score%, Ships%, GainShip%)πDECLARE SUB EnMove (n%, ShipType%)πDECLARE SUB EnemyShipPicture (n%, ShipType%)πDECLARE SUB Statistics (Score%, Ships%)πDECLARE SUB ExplosiveSound ()πDECLARE SUB Explosion (X%, Y%)πDECLARE SUB UpRight (X%, Y%)πDECLARE SUB UpLeft (X%, Y%)πDECLARE SUB DownLeft (X%, Y%)πDECLARE SUB DownRight (X%, Y%)πDECLARE SUB MoveLeft (X%)πDECLARE SUB MoveUp (Y%)πDECLARE SUB MoveDown (Y%)πDECLARE SUB RedBaron ()πDECLARE SUB RedShip ()πDECLARE SUB RedShipMask ()πDECLARE SUB EFighter ()πDECLARE SUB EFighterMask ()πDECLARE SUB EElite ()πDECLARE SUB EEliteMask ()πDECLARE SUB ECommandShip ()πDECLARE SUB ECommandShipMask ()πDECLARE SUB PrivateASCII ()πDECLARE SUB MoveRight (X%)πDECLARE SUB stars ()πDECLARE SUB MainScreen (HScore%, ASCII%)πDECLARE SUB HelpScreen ()πDECLARE SUB Intro ()πDECLARE SUB Conclusion ()πDECLARE SUB Keypad ()πDECLARE SUB Title ()πDECLARE SUB WaveInfo (Wave%, NumberofShips%, Score%, Ships%)πDECLARE SUB YouLose (Score%, Ships%)πDEFINT A-Zπ SCREEN 7, 0, 2, 0π DEF SEG = &HA000π DIM SHARED RShip%(1 TO 500), RShipMask%(1 TO 500)ππ DIM SHARED EFShip%(1 TO 500), EFShipMask%(1 TO 500)π DIM SHARED EEShip%(1 TO 500), EEShipMask%(1 TO 500)π DIM SHARED ECShip%(1 TO 1500), ECShipMask%(1 TO 1500)π DIM SHARED ASCII%(1 TO 500)π CALL RedShip: CALL RedShipMaskπ CALL EFighter: CALL EFighterMaskπ CALL EElite: CALL EEliteMaskπ CALL ECommandShip: CALL ECommandShipMaskπ CALL PrivateASCIIπ DEF FNR (X) = INT(RND * X) + 1π DIM SHARED SX(20), SY(20), ST(20)π FOR I = 1 TO 20 'sprinkle some stars π SX(I) = FNR(319): SY(I) = FNR(199)π ST(I) = FNR(2)π NEXTπ DIM SHARED EX(5), EY(5), Laser(5), Enemy(5), Eshot(5)π HScore% = 0π SCREEN 7, 0, 1, 0πLetsStart: π CLSπ Score% = 0: Ships% = 3: X% = 150: Y% = 170: ASCII% = 0π Defeated = 0: Wave = 1: ShipPoints% = 5: GainShip = 0π CALL MainScreen(HScore%, ASCII%)πDetermineWave: π IF Ships% < 1 AND Score% > HScore% THENπ HScore% = Score%π END IFπ IF Ships% < 1 THENπ CALL YouLose(Score%, Ships%): GOTO LetsStartπ END IFπ IF Wave > 25 THENπ CALL Conclusionπ IF Score% > HScore% THEN HScore% = Score%π GOTO LetsStartπ END IFπ'------ π IF ASCII% = 1 THENπ RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π Wave = 0: ShipPoints% = 100: ShipType = 4: OutOf = 20π END IFπ IF Wave = 1 THENπ RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π ShipPoints% = 5: ShipType = 1: OutOf = 20π END IFπ IF Wave = 15 THENπ RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π ShipPoints% = 10: ShipType = 2: OutOf = 1π END IFπ IF Wave = 16 THENπ RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π ShipPoints% = 5: ShipType = 1: OutOf = 20π END IFπ IF Wave = 17 THENπ RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π ShipPoints% = 10: ShipType = 2: OutOf = 1ππ END IFπ IF Wave = 20 THENπ RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π ShipPoints% = 5: ShipType = 1: OutOf = 20π END IFπ IF Wave = 21 THENπ RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π ShipPoints% = 10: ShipType = 2: OutOf = 1π END IFπ IF Wave = 25 THENπ RangeLeft = 89: RangeRight = 90π ELXC = 88: ELYC = 43: HitC = 0: PLAY "mbo1l4dl16cl2f"π ShipPoints% = 50: ShipType = 3: OutOf = 1π END IFπ CALL WaveInfo(Wave, NumberofShips, Score%, Ships%)π FOR n = 1 TO NumberofShipsπ Laser(n) = -10: Enemy(n) = 1: EY(n) = 29π Eshot(n) = 0π NEXTπ EX(1) = 137: EX(2) = 90: EX(3) = 200: EX(4) = 40π EX(5) = 250: X% = 140: Y% = 170: RANDOMIZE TIMERπ GOSUB Updateπ πKeyboardInput: π a$ = INKEY$π IF a$ = CHR$(0) + CHR$(77) THENπ CALL MoveRight(X%): GOSUB Updateπ END IFπ IF a$ = CHR$(0) + CHR$(75) THENπ CALL MoveLeft(X%): GOSUB Updateπ END IFπ IF a$ = CHR$(0) + CHR$(72) THENπ CALL MoveUp(Y%): GOSUB Updateπ END IFπ IF a$ = CHR$(0) + CHR$(80) THENπ CALL MoveDown(Y%): GOSUB Updateπ END IFπ IF a$ = CHR$(0) + CHR$(73) THENπ CALL UpRight(X%, Y%): GOSUB Updateπ END IFπ IF a$ = CHR$(0) + CHR$(71) THENπ CALL UpLeft(X%, Y%): GOSUB Updateπ END IFπ IF a$ = CHR$(0) + CHR$(79) THENπ CALL DownLeft(X%, Y%): GOSUB Updateπ END IFπ IF a$ = CHR$(0) + CHR$(81) THENπ CALL DownRight(X%, Y%): GOSUB Updateπ END IFπ IF a$ = CHR$(32) THEN GOSUB Shootπ IF a$ = "q" THEN Ships% = 0: GOTO DetermineWaveπ GOSUB PlaceEShipπ IF Lostaship = 1 THENπ Lostaship = 0: Defeated = 0: GOTO DetermineWaveπ END IFππ IF Defeated = NumberofShips THENπ Defeated = 0: Wave = Wave + 1: GOTO DetermineWaveπ END IFπ GOTO KeyboardInputπ πUpdate: π SCREEN 7, 0, 2, 0: PCOPY 1, 2π CALL starsπ PUT (X%, Y%), RShipMask%, ANDπ PUT (X%, Y%), RShip%, XORπ FOR n = 1 TO NumberofShipsπ IF Enemy(n) = 0 THEN GOTO DoneWithItπ CALL EnemyShipPicture(n, ShipType)π IF Eshot(n) = 1 THEN GOSUB EShoot 'lasers be shown? πDoneWithIt: π NEXTπ CALL Statistics(Score%, Ships%)π SCREEN 7, 0, 0, 0: PCOPY 2, 0: PCOPY 1, 2π RETURNπ πPlaceEShip: π SCREEN 7, 0, 2, 0: PCOPY 1, 2π CALL starsπ FOR n = 1 TO NumberofShipsπ IF Enemy(n) = 0 THEN GOTO DoneWithShip2π CALL EnMove(n, ShipType)π CALL EnemyShipPicture(n, ShipType)π IF Eshot(n) = 1 THENπ Laser(n) = Laser(n) + 5: GOSUB EShootπ END IFπ Doesitshoot = INT(RND * OutOf) + 1π IF Doesitshoot = 1 AND Eshot(n) = 0 THENπ Eshot(n) = 1: Laser(n) = EY(n) + ELYCπ PLAY "o4mbl64 a": GOSUB EShootπ END IFπDoneWithShip2: π NEXTπ PUT (X, Y), RShipMask%, ANDπ PUT (X, Y), RShip%, XORπ CALL Statistics(Score%, Ships%)π IF Lostaship = 1 THEN CALL Explosion(X%, Y%)π SCREEN 7, 0, 0, 0: PCOPY 2, 0: PCOPY 1, 2π RETURNπ πShoot: π LINE (X + 7, Y + 5)-(X + 7, 8), 1π LINE (X + 27, Y + 5)-(X + 27, 8), 1π PLAY "o4mbl64 a b"π FOR n = 1 TO NumberofShipsππ IF X + 5 > EX(n) - 3 AND X + 5 < EX(n) + RangeLeft THENπ FOR Grow = 1 TO 5π CIRCLE (X + 7, EY(n) + 10), Grow, 14: NEXTπ CALL ExplosiveSoundπ FOR Grow = 6 TO 8ππ CIRCLE (X + 7, EY(n) + 10), Grow, 12: NEXTπ FOR Grow = 9 TO 10π CIRCLE (X + 7, EY(n) + 10), Grow, 4: NEXTπ IF ShipType = 3 AND HitC > 100 THENπ GOSUB YouKillMeBaby: RETURNπ END IFπ IF ShipType = 3 THENπ HitC = HitC + 1: GOTO ShootPart2π END IFπ GOSUB YouKillMeBabyπ END IF '-Left laser cannon- ππShootPart2: ππ IF X + 26 > EX(n) - 2 AND X + 26 < EX(n) + RangeRight THENπ FOR Grow = 1 TO 5π CIRCLE (X + 27, EY(n) + 10), Grow, 14: NEXTπ CALL ExplosiveSoundπ FOR Grow = 6 TO 8π CIRCLE (X + 27, EY(n) + 10), Grow, 12: NEXTπ FOR Grow = 9 TO 10π CIRCLE (X + 27, EY(n) + 10), Grow, 4: NEXTπ IF ShipType = 3 AND HitC > 100 THENπ GOSUB YouKillMeBaby: RETURNπ END IFπ IF ShipType = 3 THEN HitC = HitC + 1: RETURNπ GOSUB YouKillMeBabyπ END IF '-Right laser cannon- π NEXTπ RETURNπ πYouKillMeBaby: π EX(n) = -10: EY(n) = -10: Enemy(n) = 0π Score% = Score% + ShipPoints%π Defeated = Defeated + 1π CALL ExtraShipCheck(Score%, Ships%, GainShip%)πRETURNπ πEShoot: π LINE (EX(n) + 2, Laser(n))-(EX(n) + 2, Laser(n) + 5), 4ππ LINE (EX(n) + ELXC, Laser(n))-(EX(n) + ELXC, Laser(n) + 5), 4ππ IF Eshot(n) = 1 AND EX(n) + 2 > X - 1 AND EX(n) + 2 < X + 35 AND Laser(n) > Y - 1 AND Laser(n) < Y + 12 THENπ Ships% = Ships% - 1: Lostaship = 1: RETURNπ END IF 'right laser cannon π πππ IF Eshot(n) = 1 AND EX(n) + ELXC > X - 1 AND EX(n) + ELXC < X + 35 AND Laser(n) > Y - 1 AND Laser(n) < Y + 12 THENπ Ships% = Ships% - 1: Lostaship = 1: RETURNπ END IF 'left laser cannon π IF ShipType = 3 THEN GOSUB ExtraShootπ IF Eshot(n) = 1 AND Laser(n) > 209 THEN Eshot(n) = 0π RETURNπ ππExtraShoot: π LINE (EX(n) + 17, Laser(n))-(EX(n) + 17, Laser(n) + 5), 1π LINE (EX(n) + 73, Laser(n))-(EX(n) + 73, Laser(n) + 5), 1ππ IF Eshot(n) = 1 AND EX(n) + 17 > X - 1 AND EX(n) + 2 < X + 35 AND Laser(n) > Y - 1 AND Laser(n) < Y + 12 THENπ Ships% = Ships% - 1: Lostaship = 1: RETURNπ END IF 'right laser cannon π ππ IF Eshot(n) = 1 AND EX(n) + 73 > X - 1 AND EX(n) + 73 < X + 35 AND Laser(n) > Y - 1 AND Laser(n) < Y + 12 THENπ Ships% = Ships% - 1: Lostaship = 1: RETURNπ END IF 'left laser cannon π IF Eshot(n) = 1 AND Laser(n) > 209 THEN Eshot(n) = 0πRETURNπ πSUB Conclusionπ rxpos = 300: rypos = 80πConc1: π FOR pause = 1 TO 10000: NEXTπ SCREEN 7, 0, 2, 0π CLS : CALL Sunset(rxpos, rypos)π LOCATE 17, 1: COLOR 7π PRINT " Successfully destroying the evil"π PRINT "Vordoxian fleet, you return to Earth."π PRINT "Crowds cheer as they see your ship"π PRINT "flying through the evening sky,"π PRINT "realizing that the earth has been"π PRINT "saved by the Red Baron!"π SCREEN 7, 0, 0, 0: PCOPY 2, 0π a$ = INKEY$π IF a$ = CHR$(13) THEN GOTO ConclusionDoneπ GOTO Conc1πConclusionDone: πEND SUBππSUB DownLeft (X%, Y%)π X% = X% - 5: Y% = Y% + 5π IF X% < 20 THEN X% = 20π IF Y% > 170 THEN Y% = 170πEND SUBππSUB DownRight (X%, Y%)π X% = X% + 5: Y% = Y% + 5π IF X% > 250 THEN X% = 250π IF Y% > 170 THEN Y% = 170πEND SUBππSUB ECommandShipπ CLSπ LINE (50, 10)-(54, 50), 8, B: PAINT (51, 11), 7, 8π LINE (52, 11)-(52, 49), 15π PSET (52, 10), 7: PSET (52, 50), 7π PSET (50, 10), 0: PSET (54, 10), 0π LINE (55, 11)-(57, 11), 1: LINE (58, 12)-(78, 12), 1π LINE (78, 12)-(78, 32), 1: LINE (78, 32)-(58, 32), 1ππ LINE (58, 32)-(55, 35), 1: LINE (55, 35)-(55, 11), 1π LINE (77, 12)-(77, 32), 1: PAINT (56, 12), 9, 1π LINE (58, 31)-(76, 31), 11: PSET (57, 32), 11π LINE (65, 15)-(70, 15), 4: LINE (65, 18)-(70, 18), 4π LINE (65, 20)-(70, 20), 4: LINE (65, 20)-(70, 32), 4, BFπ LINE (65, 31)-(70, 31), 12: PSET (77, 31), 9π LINE (80, 8)-(90, 10), 8, B: PAINT (81, 9), 7, 8π LINE (100, 8)-(110, 10), 8, B: PAINT (101, 9), 7, 8π LINE (80, 12)-(80, 37), 1: LINE (80, 37)-(83, 40), 1π LINE (83, 12)-(83, 40), 1: LINE (80, 12)-(83, 12), 1π LINE (82, 12)-(82, 39), 1: PAINT (81, 13), 9, 1ππ LINE (85, 11)-(85, 42), 1: LINE (85, 42)-(95, 52), 1π LINE (85, 11)-(105, 11), 1: LINE (105, 11)-(105, 42), 1π LINE (105, 42)-(95, 52), 1: PAINT (86, 12), 9, 1π LINE (107, 12)-(107, 40), 1: LINE (108, 39)-(110, 37), 1π LINE (110, 12)-(110, 36), 1: LINE (108, 12)-(110, 12), 1π PAINT (109, 13), 9, 1: LINE (90, 12)-(90, 42), 1π PSET (91, 43), 1: PSET (99, 43), 11π LINE (92, 44)-(95, 44), 1: LINE (100, 12)-(100, 42), 11π LINE (97, 44)-(98, 44), 11π PSET (93, 41), 0: PSET (95, 41), 14π PSET (94, 41), 6: PSET (96, 41), 15: PSET (97, 41), 0π LINE (93, 40)-(97, 40), 0: LINE (94, 42)-(96, 42), 0π LINE (112, 12)-(112, 32), 1: LINE (112, 12)-(132, 12), 1π LINE (112, 32)-(132, 32), 1: LINE (133, 11)-(135, 11), 1π LINE (135, 12)-(135, 35), 0: LINE (134, 11)-(134, 34), 1π LINE (132, 32)-(135, 35), 1: PAINT (113, 13), 9, 1π LINE (133, 11)-(133, 31), 1: LINE (114, 31)-(131, 31), 11π LINE (120, 15)-(125, 15), 4: LINE (120, 18)-(125, 18), 4π LINE (120, 20)-(125, 20), 4π LINE (120, 20)-(125, 32), 4, BFπ LINE (120, 31)-(125, 31), 12π LINE (136, 10)-(140, 50), 8, Bπ PAINT (137, 11), 7, 8: LINE (138, 11)-(138, 49), 15π PSET (138, 10), 7: PSET (138, 50), 7π PSET (136, 10), 0: PSET (140, 10), 0π LINE (65, 33)-(69, 50), 8, B: PAINT (66, 34), 7, 8π LINE (67, 34)-(67, 49), 15π PSET (67, 33), 7: PSET (67, 50), 7π LINE (121, 33)-(125, 50), 8, B: PAINT (122, 34), 7, 8π LINE (123, 34)-(123, 49), 15π PSET (123, 33), 7: PSET (123, 50), 7π GET (50, 8)-(140, 53), ECShip%π CLS 'clean up screen πEND SUBππSUB ECommandShipMaskπ CLSπ LINE (50, 8)-(79, 8), 15: LINE (50, 9)-(79, 9), 15π LINE (54, 10)-(79, 10), 15: LINE (58, 11)-(79, 11), 15π PSET (50, 10), 15: PSET (140, 10), 15π LINE (91, 8)-(99, 10), 15, BF: LINE (111, 8)-(140, 8), 15π LINE (111, 9)-(140, 9), 15: LINE (111, 10)-(136, 10), 15π LINE (111, 11)-(132, 11), 15: LINE (50, 53)-(140, 53), 15π LINE (50, 51)-(50, 52), 15: LINE (140, 51)-(140, 52), 15ππ LINE (94, 52)-(80, 38), 15: LINE (79, 37)-(79, 33), 15π LINE (78, 33)-(70, 33), 15: LINE (70, 33)-(70, 51), 15π LINE (70, 51)-(64, 51), 15: LINE (64, 51)-(64, 33), 15π LINE (64, 33)-(58, 33), 15: LINE (58, 33)-(55, 36), 15π LINE (55, 36)-(55, 51), 15: LINE (55, 51)-(50, 51), 15π PAINT (56, 52), 15, 15π LINE (96, 52)-(110, 38), 15: LINE (111, 37)-(111, 33), 15π LINE (112, 33)-(120, 33), 15π LINE (120, 33)-(120, 51), 15π LINE (120, 51)-(126, 51), 15π LINE (126, 51)-(126, 33), 15π LINE (126, 33)-(132, 33), 15π LINE (133, 34)-(135, 36), 15π LINE (135, 37)-(135, 51), 15π LINE (135, 51)-(140, 51), 15π PAINT (100, 49), 15, 15π GET (50, 8)-(140, 53), ECShipMask%π CLS 'clean up screen πEND SUBππSUB EEliteπ CLSπ LINE (140, 100)-(144, 115), 5, Bπ LINE (165, 100)-(161, 115), 5, Bπ LINE (145, 105)-(150, 100), 5π LINE (145, 110)-(150, 115), 5π LINE (160, 105)-(155, 100), 5π LINE (160, 110)-(155, 115), 5π LINE (150, 100)-(155, 100), 5π LINE (150, 115)-(155, 115), 5π PAINT (151, 101), 13, 5: PAINT (141, 101), 13, 5π PAINT (162, 101), 13, 5π LINE (142, 100)-(142, 115), 13π LINE (142, 101)-(142, 114), 15π LINE (163, 100)-(163, 115), 13π LINE (163, 101)-(163, 114), 15π LINE (150, 111)-(155, 111), 0π LINE (150, 112)-(155, 112), 0π LINE (151, 113)-(154, 113), 0π LINE (151, 112)-(154, 112), 9π PSET (151, 112), 1: PSET (153, 112), 11π LINE (151, 103)-(154, 103), 5π LINE (151, 105)-(154, 105), 5π LINE (151, 107)-(154, 107), 5π GET (140, 100)-(165, 115), EEShip%π CLS 'clean up screen πEND SUBππSUB EEliteMaskπ CLSπ LINE (145, 100)-(149, 100), 15π LINE (145, 100)-(145, 104), 15π LINE (145, 104)-(149, 100), 15: PAINT (146, 101), 15π LINE (156, 100)-(160, 100), 15π LINE (160, 100)-(160, 104), 15ππ LINE (160, 104)-(156, 100), 15: PAINT (158, 101), 15π LINE (145, 115)-(149, 115), 15π LINE (145, 115)-(145, 111), 15π LINE (145, 111)-(149, 115), 15: PAINT (146, 114), 15π LINE (156, 115)-(160, 115), 15π LINE (156, 115)-(160, 111), 15π LINE (160, 111)-(160, 115), 15: PAINT (158, 114), 15π GET (140, 100)-(165, 115), EEShipMask%π CLS 'clean up screen πEND SUBππSUB EFighterπ CLSπ LINE (150, 100)-(155, 100), 8π LINE (149, 101)-(149, 109), 8π LINE (156, 101)-(156, 109), 8π LINE (148, 110)-(147, 111), 8π LINE (157, 110)-(158, 111), 8π LINE (145, 111)-(146, 111), 8π LINE (159, 111)-(160, 111), 8π LINE (140, 100)-(144, 115), 8, Bπ LINE (165, 100)-(161, 115), 8, Bπ LINE (145, 113)-(150, 115), 8π LINE (151, 115)-(156, 115), 8π LINE (157, 114)-(158, 114), 8π LINE (159, 114)-(160, 113), 8π PAINT (151, 101), 7, 8: PAINT (141, 101), 7, 8π PAINT (162, 101), 7, 8π LINE (142, 100)-(142, 115), 7π LINE (142, 101)-(142, 114), 15π LINE (163, 100)-(163, 115), 7π LINE (163, 101)-(163, 114), 15π LINE (150, 111)-(155, 111), 0π LINE (150, 112)-(155, 112), 0π LINE (151, 113)-(154, 113), 0π LINE (151, 112)-(154, 112), 9π PSET (151, 112), 1: PSET (153, 112), 11π LINE (151, 103)-(154, 103), 8π LINE (151, 105)-(154, 105), 8π LINE (151, 107)-(154, 107), 8π GET (140, 100)-(165, 115), EFShip%π CLS 'clean up screen πEND SUBππSUB EFighterMaskπ CLSπ LINE (145, 100)-(147, 110), 15, BFπ LINE (148, 100)-(148, 109), 15π LINE (158, 100)-(160, 110), 15, BFπ LINE (157, 100)-(157, 109), 15π LINE (145, 115)-(148, 115), 15π LINE (157, 115)-(160, 115), 15π PSET (145, 114), 15: PSET (160, 114), 15π PSET (149, 100), 15: PSET (156, 100), 15π GET (140, 100)-(165, 115), EFShipMask%ππ CLS 'clean up screen πEND SUBππSUB EnemyShipPicture (n, ShipType)π IF ShipType = 1 THENπ PUT (EX(n), EY(n)), EFShipMask%, ANDπ PUT (EX(n), EY(n)), EFShip%, XORπ END IFπ IF ShipType = 2 THENπ PUT (EX(n), EY(n)), EEShipMask%, ANDπ PUT (EX(n), EY(n)), EEShip%, XORπ END IFπ IF ShipType = 3 THENπ PUT (EX(n), EY(n)), ECShipMask%, ANDπ PUT (EX(n), EY(n)), ECShip%, XORπ END IFπ IF ShipType = 4 THENπ PUT (EX(n), EY(n)), ASCII%, PSETπ END IFπEND SUBππSUB EnMove (n, ShipType)π Direction = INT(RND * 8) + 1π IF Direction = 1 THEN EY(n) = EY(n) - 5π IF Direction = 2 THEN EX(n) = EX(n) + 5: EY(n) = EY(n) - 5π IF Direction = 3 THEN EX(n) = EX(n) + 5π IF Direction = 4 THEN EX(n) = EX(n) + 5: EY(n) = EY(n) + 5π IF Direction = 5 THEN EY(n) = EY(n) - 5π IF Direction = 6 THEN EX(n) = EX(n) - 5: EY(n) = EY(n) + 5π IF Direction = 7 THEN EX(n) = EX(n) - 5π IF Direction = 8 THEN EX(n) = EX(n) - 5: EY(n) = EY(n) - 5π IF EX(n) < 20 THEN EX(n) = 20π IF EX(n) > 250 THEN EX(n) = 250π IF ShipType = 3 AND EX(n) > 200 THEN EX(n) = 200π IF EY(n) < 15 THEN EY(n) = 15π IF EY(n) > 100 THEN EY(n) = 100πEND SUBππSUB Explosion (X%, Y%)π FOR Grow = 1 TO 5π CIRCLE (X + 17, Y + 6), Grow, 14: NEXTπ CALL ExplosiveSoundπ FOR Grow = 6 TO 8π CIRCLE (X + 17, Y + 6), Grow, 12: NEXTπ FOR Grow = 9 TO 10π CIRCLE (X + 17, Y + 6), Grow, 4: NEXTπEND SUBππSUB ExplosiveSoundπ FOR s = 850 TO 810 STEP -1π SOUND (RND * 100 + s / 10 + 30), .1π NEXTπEND SUBππSUB ExtraShipCheck (Score%, Ships%, GainShip%)ππ IF Score% >= 100 AND GainShip = 0 THENπ Ships% = Ships% + 1: GainShip = 1π GOSUB Toon: GOTO OutCheckπ END IFπ IF Score% >= 200 AND GainShip = 1 THENπ Ships% = Ships% + 1: GainShip = 2π GOSUB Toon: GOTO OutCheckπ END IFπ IF Score% >= 300 AND GainShip = 2 THENπ Ships% = Ships% + 1: GainShip = 3π GOSUB Toon: GOTO OutCheckπ END IFπ IF Score% >= 400 AND GainShip = 3 THENπ Ships% = Ships% + 1: GainShip = 4π GOSUB Toon: GOTO OutCheckπ END IFπ IF Score% >= 500 AND GainShip = 4 THENπ Ships% = Ships% + 1: GainShip = 5π GOSUB Toon: GOTO OutCheckπ END IFπ GOTO OutCheckπToon: π PLAY "mbo2l16ddeeffgg": RETURNπOutCheck: πEND SUBππSUB HelpScreenπHelpPart1: π SCREEN 7, 0, 2, 0π CLS : LOCATE 25, 1: COLOR 5π PRINT "Press to exit or for next page."π LOCATE 25, 7: COLOR 11: PRINT "ESC"π LOCATE 1, 1: COLOR 12: PRINT "Instructions"π LOCATE 1, 30: COLOR 15: PRINT "Page 1 of 3"π LINE (0, 9)-(319, 9), 4π LOCATE 3, 1: COLOR 15π PRINT "Blast your way through twentyfive waves"π LOCATE 4, 1: PRINT "of Vordoxian scum to save the earth!"π PUT (10, 48), RShip%, PSETπ PUT (15, 121), EFShip%, PSETπ LOCATE 8, 24: COLOR 14: PRINT "The Red Baron"π LOCATE 10, 1: COLOR 7π PRINT "Your fighter. Armed with the latest in"π PRINT "laser technology, the Red Baron's dual"π PRINT "laser cannons will cut through an enemy"π PRINT "fighter craft like a chainsaw through"π PRINT "a teenager! Or so I've heard..."π LOCATE 17, 20: COLOR 14: PRINT "Vordoxian Fighter"π LOCATE 19, 1: COLOR 7π PRINT "The most common type of space craft"π PRINT "employed by the enemy. These ships"π PRINT "are armed with two laser cannons,"π PRINT "although not nearly as powerful as"π PRINT "the Red Baron's."π LOCATE 23, 19: COLOR 3: PRINT "(5 points)"ππ LINE (173, 188)-(183, 198), 4, Bπ PAINT (174, 189), 12, 4: LINE (178, 190)-(178, 196), 0π LINE (177, 195)-(179, 195), 0π LINE (176, 194)-(180, 194), 0π PSET (182, 189), 15π SCREEN 7, 0, 0, 0: PCOPY 2, 0πUserInput2: π a$ = INKEY$π IF a$ = CHR$(0) + CHR$(80) THEN GOTO HelpPart2π IF a$ = CHR$(27) THEN GOTO HelpDoneπ GOTO UserInput2πHelpPart2: π SCREEN 7, 0, 2, 0π CLS : LOCATE 25, 3: COLOR 5π PRINT "Press to exit or or ."π LOCATE 25, 9: COLOR 11: PRINT "ESC"π LOCATE 1, 1: COLOR 12: PRINT "Instructions"π LOCATE 1, 30: COLOR 15: PRINT "Page 2 of 3"π LINE (0, 9)-(319, 9), 4π PUT (15, 13), EEShip%, PSETπ LOCATE 3, 14: COLOR 14: PRINT "Vordoxian Elite Fighter"π LOCATE 5, 1: COLOR 7π PRINT "The pilots of these ships are a little"π PRINT "more trigger happy than the norm."π PRINT "Always joined by fellow Elite ships,"π PRINT "they will often fire in sync."π LOCATE 9, 1: COLOR 3: PRINT "(10 points)"π LOCATE 12, 4: COLOR 9: PRINT "?"π LOCATE 12, 13: COLOR 14: PRINT "Vordoxian Command Vessel"π LOCATE 14, 1: COLOR 7π PRINT "Chances are, the command ship leading"π PRINT "the Vordoxian fighters is pretty"π PRINT "powerful."π LOCATE 16, 12: COLOR 3: PRINT "(50 points)"π LINE (188, 188)-(198, 198), 4, Bπ PAINT (189, 189), 12, 4: LINE (193, 190)-(193, 196), 0π LINE (192, 191)-(194, 191), 0π LINE (191, 192)-(195, 192), 0π PSET (197, 189), 15π LINE (248, 188)-(258, 198), 4, Bπ PAINT (249, 189), 12, 4: LINE (253, 190)-(253, 196), 0π LINE (252, 194)-(254, 194), 0π LINE (251, 193)-(255, 193), 0π PSET (257, 189), 15π SCREEN 7, 0, 0, 0: PCOPY 2, 0πUserInput3: π a$ = INKEY$π IF a$ = CHR$(0) + CHR$(80) THEN GOTO HelpPart3π IF a$ = CHR$(0) + CHR$(72) THEN GOTO HelpPart1π IF a$ = CHR$(27) THEN GOTO HelpDoneπ GOTO UserInput3πHelpPart3: π SCREEN 7, 0, 2, 0π CLS : LOCATE 25, 1: COLOR 5π PRINT "Press to exit or for prev page."ππ LOCATE 25, 7: COLOR 11: PRINT "ESC"π LOCATE 1, 1: COLOR 12: PRINT "Instructions"π LOCATE 1, 30: COLOR 15: PRINT "Page 3 of 3"π LINE (0, 9)-(319, 9), 4π CALL Keypadπ LOCATE 5, 10: COLOR 7π PRINT "Although you can use the"π LOCATE 6, 10: PRINT "separate arrow keys, it's"π LOCATE 7, 10: PRINT "recommended that you use"π LOCATE 8, 10: PRINT "the keypad, as this will"π LOCATE 9, 10: PRINT "allow you to move in all"π LOCATE 10, 10: PRINT "eight directions."π LOCATE 15, 1: PRINT "Press the"π LOCATE 15, 11: COLOR 15: PRINT "SPACE BAR"π LOCATE 15, 21: COLOR 7: PRINT "to fire."π COLOR 3π LOCATE 11, 10: PRINT "(Number Lock must be off.)"π LOCATE 17, 1: COLOR 7π PRINT "For every 100 points, up to 500, you"π PRINT "will receive an extra ship."π LOCATE 20, 1: COLOR 7π PRINT "If you wish to end the game while"π PRINT "playing, just press `"π LOCATE 21, 22: COLOR 15: PRINT "q"π LOCATE 21, 23: COLOR 7: PRINT "' to quit."π SCREEN 7, 0, 0, 0: PCOPY 2, 0π LINE (173, 188)-(183, 198), 4, Bπ PAINT (174, 189), 12, 4: LINE (178, 190)-(178, 196), 0π LINE (177, 191)-(179, 191), 0π LINE (176, 192)-(180, 192), 0π PSET (182, 189), 15πUserInput4: π a$ = INKEY$π IF a$ = CHR$(0) + CHR$(72) THEN GOTO HelpPart2π IF a$ = CHR$(27) THEN GOTO HelpDoneπ GOTO UserInput4πHelpDone: πEND SUBππSUB IntroπIntro1: π SCREEN 7, 0, 2, 0π CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π PRINT " The Red Baron. That is what the"π PRINT "media has called it. The vigilante"π PRINT "space craft has been known to appear"π PRINT "in distant areas of space, aiding small"π PRINT "colonies in defense from pirates and"π PRINT "scavengers."π SCREEN 7, 0, 0, 0: PCOPY 2, 0π a$ = INKEY$π IF a$ = CHR$(13) THEN GOTO Intro2π GOTO Intro1πIntro2: π SCREEN 7, 0, 2, 0ππ CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π PRINT " No one knows who the pilot is."π PRINT "A He? She? It? The authorities have"π PRINT "been desparate to catch the pilot."π PRINT "Even more so now than before due to"π PRINT "the recent events..."π SCREEN 7, 0, 0, 0: PCOPY 2, 0π a$ = INKEY$π IF a$ = CHR$(13) THEN GOTO Intro3π GOTO Intro2πIntro3: π SCREEN 7, 0, 2, 0π CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π PRINT " An alien race, known as the"π PRINT "Vordoxians, has declared war on mankind."π PRINT "Their first attack was swift and deadly."π PRINT "Capturing a distant communications"π PRINT "outpost, the Vordoxians released the"π PRINT "most powerful computer virus ever known"π PRINT "to man."π SCREEN 7, 0, 0, 0: PCOPY 2, 0π a$ = INKEY$π IF a$ = CHR$(13) THEN GOTO Intro4π GOTO Intro3πIntro4: π SCREEN 7, 0, 2, 0π CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π PRINT " The virus infected everything."π PRINT "No matter how well secure the system,"π PRINT "the computer virus was able to penetrate"π PRINT "its defenses. After only twentyfour"π PRINT "hours, virtually everything electronic"π PRINT "was rendered useless."π SCREEN 7, 0, 0, 0: PCOPY 2, 0π a$ = INKEY$π IF a$ = CHR$(13) THEN GOTO Intro5π GOTO Intro4πIntro5: π SCREEN 7, 0, 2, 0π CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π PRINT " Astronomers, using nothing more"π PRINT "than simple telescopes, then discovered"π PRINT "the second part in this evil attack."π PRINT "Hordes of Vordoxian fighters had been"π PRINT "sighted entering Earth's solar system!"π PRINT "Without a solid defense after the virus"π PRINT "the end of the Human race was eminent."π SCREEN 7, 0, 0, 0: PCOPY 2, 0π a$ = INKEY$π IF a$ = CHR$(13) THEN GOTO Intro6π GOTO Intro5πIntro6: π SCREEN 7, 0, 2, 0π CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π PRINT " Then miraculously, the Red Baron"ππ PRINT "was sighted! Somehow escaping the"π PRINT "clutches of the Vordoxian computer"π PRINT "virus, the red ship was seen heading"π PRINT "on an intercept course for the enemy."π PRINT "Now the Red Baron was the last hope"π PRINT "for the Human race..."π SCREEN 7, 0, 0, 0: PCOPY 2, 0π a$ = INKEY$π IF a$ = CHR$(13) THEN GOTO IntroDoneπ GOTO Intro6πIntroDone: πEND SUBππSUB Keypadπ LINE (10, 35)-(20, 45), 8, B: PAINT (11, 36), 7, 8π LINE (22, 35)-(32, 45), 8, B: PAINT (23, 36), 7, 8π LINE (34, 35)-(44, 45), 8, B: PAINT (35, 36), 7, 8π LINE (46, 35)-(56, 45), 8, B: PAINT (47, 36), 7, 8π LINE (46, 47)-(56, 69), 8, B: PAINT (47, 48), 7, 8π LINE (46, 71)-(56, 93), 8, B: PAINT (47, 73), 7, 8π LINE (10, 83)-(32, 93), 8, B: PAINT (11, 84), 7, 8π LINE (34, 83)-(44, 93), 8, B: PAINT (35, 84), 7, 8π LINE (10, 47)-(20, 57), 7, B: PAINT (11, 48), 15, 7π LINE (22, 47)-(32, 57), 7, B: PAINT (23, 48), 15, 7π LINE (34, 47)-(44, 57), 7, B: PAINT (35, 48), 15, 7π LINE (10, 59)-(20, 69), 7, B: PAINT (11, 60), 15, 7π LINE (22, 59)-(32, 69), 7, B: PAINT (23, 60), 15, 7π LINE (34, 59)-(44, 69), 7, B: PAINT (35, 60), 15, 7π LINE (10, 71)-(20, 81), 7, B: PAINT (11, 72), 15, 7π LINE (22, 71)-(32, 81), 7, B: PAINT (23, 72), 15, 7π LINE (34, 71)-(44, 81), 7, B: PAINT (35, 72), 15, 7π LINE (13, 50)-(17, 54), 0π LINE (13, 51)-(14, 50), 0: LINE (13, 52)-(15, 50), 0π LINE (27, 50)-(27, 54), 0π LINE (26, 51)-(28, 51), 0: LINE (25, 52)-(29, 52), 0π LINE (37, 54)-(41, 50), 0π LINE (40, 50)-(41, 51), 0: LINE (39, 50)-(41, 52), 0π LINE (13, 64)-(17, 64), 0π LINE (14, 63)-(14, 65), 0: LINE (15, 62)-(15, 66), 0π LINE (37, 64)-(41, 64), 0π LINE (40, 63)-(40, 65), 0: LINE (39, 62)-(39, 66), 0π LINE (13, 78)-(17, 74), 0π LINE (13, 77)-(14, 78), 0: LINE (13, 76)-(15, 78), 0π LINE (27, 74)-(27, 78), 0π LINE (26, 77)-(28, 77), 0: LINE (25, 76)-(29, 76), 0π LINE (37, 74)-(41, 78), 0π LINE (40, 78)-(41, 77), 0: LINE (39, 78)-(41, 76), 0πEND SUBππSUB MainScreen (HScore%, ASCII%)πStart: π SCREEN 7, 0, 2, 0π CLS : CALL Titleπ LOCATE 12, 16: COLOR 9: PRINT "High Score:"π LOCATE 13, 15: COLOR 11: PRINT HScore%ππ LINE (99, 120)-(220, 183), 4, Bπ LINE (100, 121)-(219, 182), 12, Bπ LINE (101, 122)-(218, 181), 4, Bπ COLOR 11: LOCATE 17, 18: PRINT "Select:"π C1 = 15: C2 = 4: C3 = 4: C4 = 4π highlight = 1π SCREEN 7, 0, 0, 0: PCOPY 2, 0πDisplayText1: π COLOR C1: LOCATE 19, 15: PRINT "Introduction"π COLOR C2: LOCATE 20, 16: PRINT "Play Game"π COLOR C3: LOCATE 21, 19: PRINT "Help"π COLOR C4: LOCATE 22, 19: PRINT "Quit"π πUserInput1: π a$ = INKEY$π IF a$ = CHR$(0) + CHR$(72) THENπ highlight = highlight - 1: GOTO HightOfMyLight1π END IFπ IF a$ = CHR$(0) + CHR$(80) THENπ highlight = highlight + 1: GOTO HightOfMyLight1π END IFπ IF a$ = CHR$(13) THEN GOTO DetermineSelection1π IF a$ = "a" OR a$ = "A" THEN ASCII% = 1π GOTO UserInput1π πHightOfMyLight1: π IF highlight > 4 THEN highlight = 1π IF highlight < 1 THEN highlight = 4π IF highlight = 1 THEN C1 = 15: C2 = 4: C3 = 4: C4 = 4π IF highlight = 2 THEN C2 = 15: C1 = 4: C3 = 4: C4 = 4π IF highlight = 3 THEN C3 = 15: C1 = 4: C2 = 4: C4 = 4π IF highlight = 4 THEN C4 = 15: C1 = 4: C2 = 4: C3 = 4π GOTO DisplayText1π πDetermineSelection1: π IF highlight = 1 THEN CALL Intro: GOTO Startπ IF highlight = 2 THEN GOTO Done1π IF highlight = 3 THEN CALL HelpScreen: GOTO Startπ IF highlight = 4 THEN CLS : SYSTEMπ GOTO DisplayText1πDone1: πEND SUBππSUB MoveDown (Y%)π Y% = Y% + 5π IF Y% > 170 THEN Y% = 170πEND SUBππSUB MoveLeft (X%)π X% = X% - 5π IF X% < 20 THEN X% = 20πEND SUBππSUB MoveRight (X%)π X% = X% + 5ππ IF X% > 250 THEN X% = 250πEND SUBππSUB MoveUp (Y%)π Y% = Y% - 5π IF Y% < 100 THEN Y% = 100πEND SUBππSUB PrivateASCIIπ CLS : LOCATE 1, 3: COLOR 12: PRINT "O"π LOCATE 2, 2: PRINT "/"π LOCATE 2, 3: COLOR 10: PRINT "|"π LOCATE 2, 4: COLOR 12: PRINT "\"π LOCATE 3, 2: COLOR 9: PRINT "/ \"π GET (8, 0)-(30, 22), ASCII%π CLSπEND SUBππSUB RedBaronπ RDirect = INT(RND * 4) + 1π IF RDirect = 1 THEN ry = -5π IF RDirect = 2 THEN rx = 5π IF RDirect = 3 THEN ry = 5π IF RDirect = 4 THEN rx = -5π CIRCLE (125 + rx, 80 + ry), 11, 4π PAINT (130 + rx, 85 + ry), 4, 4π CIRCLE (125 + rx, 80 + ry), 8, 0π CIRCLE (125 + rx, 80 + ry), 2, 0π PAINT (125 + rx, 80 + ry), 0, 0π LINE (90 + rx, 60 + ry)-(115 + rx, 85 + ry), 4π LINE (100 + rx, 50 + ry)-(135 + rx, 75 + ry), 4π LINE (100 + rx, 50 + ry)-(97 + rx, 49 + ry), 4π LINE (97 + rx, 49 + ry)-(90 + rx, 50 + ry), 4π LINE (89 + rx, 51 + ry)-(88 + rx, 52 + ry), 4π LINE (88 + rx, 52 + ry)-(88 + rx, 56 + ry), 4π LINE (88 + rx, 57 + ry)-(89 + rx, 59 + ry), 4π PAINT (92 + rx, 60 + ry), 12, 4π LINE (95 + rx, 50 + ry)-(122 + rx, 70 + ry), 15π CIRCLE (225 + rx, 80 + ry), 11, 4π PAINT (230 + rx, 85 + ry), 4, 4π CIRCLE (225 + rx, 80 + ry), 8, 0π CIRCLE (225 + rx, 80 + ry), 2, 0π PAINT (225 + rx, 80 + ry), 0, 0π LINE (180 + rx, 60 + ry)-(215 + rx, 85 + ry), 4π LINE (190 + rx, 50 + ry)-(234 + rx, 74 + ry), 4π LINE (190 + rx, 50 + ry)-(187 + rx, 49 + ry), 4π LINE (187 + rx, 49 + ry)-(180 + rx, 50 + ry), 4π LINE (179 + rx, 51 + ry)-(178 + rx, 52 + ry), 4π LINE (178 + rx, 52 + ry)-(178 + rx, 56 + ry), 4π LINE (178 + rx, 57 + ry)-(179 + rx, 59 + ry), 4π PAINT (192 + rx, 60 + ry), 12, 4π LINE (185 + rx, 50 + ry)-(221 + rx, 70 + ry), 15π LINE (118 + rx, 55 + ry)-(165 + rx, 55 + ry), 4π LINE (118 + rx, 55 + ry)-(113 + rx, 58 + ry), 4π LINE (166 + rx, 55 + ry)-(184 + rx, 58 + ry), 4ππ LINE (185 + rx, 59 + ry)-(205 + rx, 71 + ry), 4π LINE (205 + rx, 71 + ry)-(185 + rx, 71 + ry), 4π LINE (192 + rx, 71 + ry)-(205 + rx, 75 + ry), 4, BFπ LINE (130 + rx, 71 + ry)-(145 + rx, 71 + ry), 4π LINE (135 + rx, 75 + ry)-(145 + rx, 75 + ry), 4π LINE (145 + rx, 71 + ry)-(145 + rx, 75 + ry), 4π LINE (145 + rx, 71 + ry)-(180 + rx, 96 + ry), 4π LINE (155 + rx, 82 + ry)-(180 + rx, 100 + ry), 4π LINE (140 + rx, 75 + ry)-(150 + rx, 82 + ry), 4π LINE (150 + rx, 82 + ry)-(155 + rx, 82 + ry), 4π LINE (147 + rx, 74 + ry)-(147 + rx, 76 + ry), 4π LINE (147 + rx, 76 + ry)-(145 + rx, 78 + ry), 4π LINE (185 + rx, 71 + ry)-(220 + rx, 96 + ry), 4π PAINT (190 + rx, 72 + ry), 4, 4π LINE (180 + rx, 96 + ry)-(191 + rx, 102 + ry), 4π LINE (180 + rx, 100 + ry)-(190 + rx, 103 + ry), 4π LINE (220 + rx, 96 + ry)-(221 + rx, 100 + ry), 4π LINE (220 + rx, 101 + ry)-(215 + rx, 103 + ry), 4π LINE (214 + rx, 103 + ry)-(205 + rx, 104 + ry), 4π LINE (204 + rx, 104 + ry)-(195 + rx, 103 + ry), 4π LINE (195 + rx, 103 + ry)-(189 + rx, 103 + ry), 4π PAINT (170 + rx, 90 + ry), 4, 4π PAINT (188 + rx, 102 + ry), 4, 4π PAINT (180 + rx, 70 + ry), 12, 4π PAINT (140 + rx, 72 + ry), 4, 4π LINE (179 + rx, 59 + ry)-(194 + rx, 70 + ry), 12π PSET (120 + rx, 62 + ry), 4: PSET (125 + rx, 65 + ry), 4π PSET (179 + rx, 100 + ry), 0π PSET (181 + rx, 101 + ry), 0π LINE (184 + rx, 90 + ry)-(205 + rx, 90 + ry), 0π LINE (184 + rx, 90 + ry)-(190 + rx, 95 + ry), 0π LINE (191 + rx, 95 + ry)-(197 + rx, 96 + ry), 0π LINE (205 + rx, 90 + ry)-(210 + rx, 93 + ry), 0π LINE (211 + rx, 94 + ry)-(207 + rx, 96 + ry), 0π LINE (207 + rx, 96 + ry)-(198 + rx, 96 + ry), 0π PAINT (200 + rx, 91 + ry), 14, 0π CIRCLE (193 + rx, 93 + ry), 1, 15π LINE (191 + rx, 93 + ry)-(195 + rx, 93 + ry), 15π LINE (200 + rx, 95 + ry)-(206 + rx, 95 + ry), 6π LINE (207 + rx, 94 + ry)-(208 + rx, 94 + ry), 6π PSET (194 + rx, 95 + ry), 6π PSET (205 + rx, 91 + ry), 6π LINE (207 + rx, 92 + ry)-(208 + rx, 93 + ry), 6π LINE (70 + rx, 73 + ry)-(106 + rx, 73 + ry), 4π LINE (106 + rx, 73 + ry)-(98 + rx, 65 + ry), 4π LINE (102 + rx, 72 + ry)-(96 + rx, 66 + ry), 12π LINE (70 + rx, 73 + ry)-(98 + rx, 65 + ry), 4π PAINT (75 + rx, 72 + ry), 12, 4π LINE (234 + rx, 73 + ry)-(245 + rx, 73 + ry), 4π LINE (245 + rx, 73 + ry)-(220 + rx, 66 + ry), 4π PAINT (238 + rx, 72 + ry), 12, 4π PSET (224 + rx, 68 + ry), 12π PSET (114 + rx, 83 + ry), 12π LINE (160 + rx, 75 + ry)-(175 + rx, 85 + ry), 4π LINE (183 + rx, 75 + ry)-(198 + rx, 85 + ry), 4ππ LINE (150 + rx, 59 + ry)-(145 + rx, 64 + ry), 15π LINE (146 + rx, 65 + ry)-(168 + rx, 70 + ry), 4π LINE (151 + rx, 59 + ry)-(168 + rx, 62 + ry), 4π LINE (168 + rx, 63 + ry)-(169 + rx, 70 + ry), 4π LINE (129 + rx, 71 + ry)-(130 + rx, 71 + ry), 0π LINE (131 + rx, 72 + ry)-(132 + rx, 72 + ry), 0π LINE (132 + rx, 72 + ry)-(135 + rx, 75 + ry), 0π LDirect = INT(RND * 5) + 1π IF LDirect = 1 THENπ LINE (125 + rx, 80 + ry)-(165 + rx, 110 + ry), 1π LINE (225 + rx, 80 + ry)-(275 + rx, 110 + ry), 1π END IFπ PSET (10, 40), 9: PSET (280, 50), 9π PSET (40, 90), 9: PSET (110, 35), 1π PSET (30, 100), 1: PSET (150, 90), 9π PSET (250, 70), 9: PSET (100, 100), 1π PSET (200, 45), 9: PSET (290, 105), 1πEND SUBππSUB RedShipπ CLSπ LINE (140, 150)-(144, 160), 4, Bπ PAINT (141, 151), 12, 4π LINE (142, 150)-(142, 160), 12π LINE (142, 151)-(142, 159), 15π PSET (140, 160), 0: PSET (144, 160), 0π LINE (145, 158)-(148, 160), 4π LINE (149, 160)-(156, 160), 4π LINE (159, 158)-(157, 160), 4π LINE (145, 153)-(148, 153), 4π LINE (159, 153)-(156, 153), 4π LINE (148, 153)-(148, 145), 4π LINE (156, 153)-(156, 145), 4π LINE (149, 144)-(153, 143), 4π LINE (154, 143)-(156, 145), 4π LINE (160, 150)-(164, 160), 4, Bπ PAINT (150, 150), 12, 4π LINE (151, 154)-(149, 156), 4π LINE (149, 156)-(151, 158), 4π LINE (153, 154)-(155, 156), 15π LINE (153, 158)-(154, 157), 15π PSET (152, 154), 4: PSET (152, 158), 15π LINE (150, 147)-(154, 147), 0π PSET (150, 146), 0: PSET (154, 146), 0π LINE (151, 145)-(153, 145), 0π LINE (151, 146)-(153, 146), 6π PSET (152, 146), 14: PSET (153, 146), 15π PAINT (161, 151), 12, 4π LINE (162, 150)-(162, 160), 12π LINE (162, 151)-(162, 159), 15π PSET (160, 160), 0: PSET (164, 160), 0π LINE (135, 153)-(139, 153), 4π LINE (135, 153)-(139, 155), 4π LINE (165, 153)-(169, 153), 4π LINE (165, 155)-(166, 155), 4ππ LINE (167, 154)-(168, 154), 4π LINE (138, 154)-(139, 154), 12π LINE (165, 154)-(166, 154), 12π LINE (150, 149)-(150, 152), 4π LINE (154, 149)-(154, 152), 4π GET (135, 143)-(169, 160), RShip%πEND SUBππSUB RedShipMaskπ CLSπ LINE (140, 143)-(149, 143), 15π LINE (155, 143)-(164, 143), 15π LINE (140, 144)-(148, 144), 15π LINE (156, 144)-(164, 144), 15π LINE (140, 145)-(147, 149), 15, BFπ LINE (135, 143)-(139, 152), 15, BFπ LINE (165, 143)-(169, 152), 15, BFπ LINE (145, 150)-(147, 150), 15π LINE (145, 151)-(147, 151), 15π LINE (145, 152)-(147, 152), 15π LINE (157, 145)-(164, 149), 15, BFπ LINE (157, 150)-(159, 150), 15π LINE (157, 151)-(159, 151), 15π LINE (157, 152)-(159, 152), 15π PSET (145, 159), 15π LINE (144, 160)-(146, 160), 15π PSET (159, 159), 15π LINE (158, 160)-(160, 160), 15π LINE (135, 156)-(139, 160), 15, BFπ LINE (165, 156)-(169, 160), 15, BFπ PSET (140, 160), 15: PSET (164, 160), 15π LINE (135, 155)-(137, 155), 15π LINE (167, 155)-(169, 155), 15π PSET (135, 154), 15: PSET (169, 154), 15π GET (135, 143)-(169, 160), RShipMask%πEND SUBππSUB starsπ FOR I = 1 TO 20π IF ST(I) = 1 THEN C = 1 ELSE C = 9π PSET (SX(I), SY(I)), Cπ SY(I) = SY(I) + ST(I) + 1π IF SY(I) > 199 THENπ SY(I) = 0: SY(I) = FNR(1)π ST(I) = FNR(2)π END IFπ NEXTπEND SUBππSUB Statistics (Score%, Ships%)π LINE (7, 0)-(13, 7), 7, BF: LINE (13, 1)-(13, 7), 15π LINE (7, 0)-(12, 0), 8: LINE (7, 1)-(7, 6), 8π LINE (8, 7)-(13, 7), 15: LINE (304, 0)-(310, 7), 7, BFπ LINE (310, 1)-(310, 7), 15: LINE (304, 0)-(309, 0), 8π LINE (304, 0)-(304, 6), 8: LINE (305, 7)-(310, 7), 15ππ LINE (106, 0)-(215, 7), 7, BF: LINE (106, 0)-(106, 6), 8π LINE (106, 0)-(214, 0), 8: LINE (215, 1)-(215, 7), 15π LINE (107, 7)-(214, 7), 15π LOCATE 1, 3: COLOR 4: PRINT "Score:"π LOCATE 1, 9: COLOR 11: PRINT Score%π LOCATE 1, 29: COLOR 10: PRINT "Ships:"π LOCATE 1, 35: COLOR 11: PRINT Ships%πEND SUBππSUB Sunset (rxpos, rypos)π LINE (19, 40)-(300, 55), 4, BFπ LINE (19, 55)-(300, 70), 12, BFπ LINE (19, 70)-(300, 90), 14, BFπ LINE (19, 30)-(300, 30), 4π LINE (19, 38)-(300, 38), 4: LINE (19, 35)-(300, 35), 4π LINE (19, 45)-(300, 45), 12π LINE (19, 50)-(300, 50), 12: LINE (19, 53)-(300, 53), 12π LINE (19, 60)-(300, 60), 14π LINE (19, 68)-(300, 68), 14: LINE (19, 65)-(300, 65), 14π CIRCLE (155, 90), 20, 15π PAINT (155, 90), 15, 15π LINE (0, 91)-(319, 110), 0, BFπ LINE (19, 55)-(25, 60), 0: LINE (25, 60)-(35, 65), 0π LINE (35, 65)-(44, 80), 0: LINE (44, 80)-(60, 90), 0π PAINT (21, 60), 0, 0π LINE (250, 90)-(270, 80), 0: LINE (270, 80)-(275, 75), 0π LINE (276, 75)-(290, 90), 0: PAINT (260, 88), 0, 0π PSET (100, 20), 1: PSET (250, 25), 8: PSET (50, 28), 8π PSET (70, 36), 1: PSET (200, 33), 1: PSET (210, 10), 1π PSET (20, 20), 9: PSET (55, 10), 9: PSET (170, 15), 9π PSET (150, 13), 9: PSET (149, 13), 1: PSET (151, 13), 1π PSET (150, 12), 1: PSET (150, 14), 1: PSET (280, 20), 1π IF rxpos < 1 THEN rxpos = 300: rypos = 80π rxpos = rxpos - 5: rypos = rypos - 1π LINE (rxpos, rypos)-(rxpos + 3, rypos), 0, BF'ship πSunsetDone: πEND SUBππSUB Titleπ 'r π LINE (35, 10)-(75, 10), 4: LINE (35, 10)-(40, 15), 4π LINE (40, 15)-(40, 30), 4: LINE (40, 30)-(35, 35), 4π LINE (35, 35)-(55, 35), 4: LINE (55, 35)-(50, 30), 4π LINE (50, 30)-(50, 15), 4: LINE (50, 15)-(65, 15), 4π LINE (65, 15)-(85, 35), 4: LINE (75, 10)-(85, 20), 4π LINE (55, 20)-(85, 20), 4: LINE (55, 20)-(65, 30), 4π LINE (65, 30)-(60, 35), 4: LINE (60, 35)-(85, 35), 4π 'e π LINE (85, 10)-(90, 15), 4: LINE (85, 10)-(135, 10), 4π LINE (135, 10)-(130, 15), 4: LINE (130, 15)-(100, 15), 4π LINE (90, 15)-(90, 30), 4: LINE (90, 30)-(85, 35), 4π LINE (85, 35)-(135, 35), 4: LINE (135, 35)-(130, 30), 4π LINE (130, 30)-(100, 30), 4: LINE (100, 15)-(100, 20), 4π LINE (100, 30)-(100, 25), 4: LINE (100, 20)-(120, 20), 4π LINE (100, 25)-(120, 25), 4: LINE (120, 20)-(120, 25), 4ππ 'd π LINE (135, 10)-(175, 10), 4: LINE (135, 10)-(140, 15), 4π LINE (140, 15)-(140, 30), 4: LINE (140, 30)-(135, 35), 4π LINE (135, 35)-(175, 35), 4: LINE (150, 15)-(150, 30), 4π LINE (150, 15)-(170, 15), 4: LINE (150, 30)-(170, 30), 4π LINE (175, 10)-(185, 20), 4: LINE (175, 35)-(185, 25), 4π LINE (185, 20)-(185, 25), 4: LINE (170, 15)-(175, 20), 4π LINE (170, 30)-(175, 25), 4: LINE (175, 20)-(175, 25), 4π 'b π LINE (35, 40)-(75, 40), 4: LINE (35, 40)-(40, 45), 4π LINE (40, 45)-(40, 60), 4: LINE (40, 60)-(35, 65), 4π LINE (35, 65)-(75, 65), 4: LINE (75, 40)-(85, 50), 4π LINE (75, 65)-(85, 55), 4: LINE (85, 50)-(83, 52), 4π LINE (85, 55)-(83, 53), 4: LINE (50, 45)-(70, 45), 4π LINE (70, 45)-(75, 50), 4: LINE (75, 50)-(50, 50), 4π LINE (50, 45)-(50, 50), 4: LINE (50, 60)-(70, 60), 4π LINE (70, 60)-(75, 55), 4: LINE (75, 55)-(50, 55), 4π LINE (50, 55)-(50, 60), 4π 'a π LINE (110, 40)-(85, 65), 4: LINE (110, 40)-(135, 65), 4π LINE (85, 65)-(105, 65), 4: LINE (105, 65)-(100, 60), 4π LINE (100, 60)-(105, 55), 4: LINE (105, 55)-(115, 55), 4π LINE (135, 65)-(115, 65), 4: LINE (115, 65)-(120, 60), 4π LINE (120, 60)-(115, 55), 4π 'r π LINE (135, 40)-(175, 40), 4: LINE (135, 40)-(140, 45), 4π LINE (140, 45)-(140, 60), 4: LINE (140, 60)-(135, 65), 4π LINE (135, 65)-(155, 65), 4: LINE (155, 65)-(150, 60), 4π LINE (150, 60)-(150, 45), 4: LINE (150, 45)-(165, 45), 4π LINE (165, 45)-(185, 65), 4: LINE (175, 40)-(185, 50), 4π LINE (155, 50)-(185, 50), 4: LINE (155, 50)-(165, 60), 4π LINE (165, 60)-(160, 65), 4: LINE (160, 65)-(185, 65), 4π 'o π LINE (195, 40)-(225, 40), 4: LINE (195, 40)-(190, 45), 4π LINE (225, 40)-(230, 45), 4: LINE (190, 45)-(190, 60), 4π LINE (230, 45)-(230, 60), 4: LINE (190, 60)-(195, 65), 4π LINE (230, 60)-(225, 65), 4: LINE (195, 65)-(225, 65), 4π LINE (200, 45)-(220, 60), 4, Bπ 'n π LINE (235, 40)-(240, 45), 4: LINE (240, 45)-(240, 60), 4π LINE (240, 60)-(235, 65), 4: LINE (235, 40)-(250, 40), 4π LINE (250, 40)-(265, 55), 4: LINE (235, 65)-(255, 65), 4π LINE (255, 65)-(250, 60), 4: LINE (250, 60)-(250, 50), 4π LINE (250, 50)-(265, 65), 4: LINE (265, 55)-(265, 40), 4π LINE (265, 40)-(280, 40), 4: LINE (280, 40)-(275, 45), 4π LINE (275, 45)-(275, 65), 4: LINE (275, 65)-(265, 65), 4π PAINT (37, 11), 12, 4: PAINT (62, 34), 12, 4π PAINT (87, 11), 12, 4: PAINT (137, 11), 12, 4π PAINT (37, 41), 12, 4: PAINT (110, 41), 12, 4π PAINT (137, 41), 12, 4: PAINT (162, 64), 12, 4π PAINT (195, 41), 12, 4: PAINT (237, 41), 12, 4π LINE (216, 25)-(245, 25), 12π LOCATE 3, 28: COLOR 4: PRINT "2573"πEND SUBππSUB UpLeft (X%, Y%)π X% = X% - 5: Y% = Y% - 5π IF X% < 20 THEN X% = 20π IF Y% < 100 THEN Y% = 100πEND SUBππSUB UpRight (X%, Y%)π X% = X% + 5: Y% = Y% - 5π IF X% > 250 THEN X% = 250π IF Y% < 100 THEN Y% = 100πEND SUBππSUB WaveInfo (Wave, NumberofShips, Score%, Ships%)π IF Wave = 0 THEN NumberofShips = 5π IF Wave = 1 THEN NumberofShips = 1π IF Wave = 2 THEN NumberofShips = 2π IF Wave = 3 THEN NumberofShips = 2π IF Wave = 4 THEN NumberofShips = 3π IF Wave = 5 THEN NumberofShips = 3π IF Wave = 6 THEN NumberofShips = 3π IF Wave = 7 THEN NumberofShips = 4π IF Wave = 8 THEN NumberofShips = 4π IF Wave = 9 THEN NumberofShips = 4π IF Wave = 10 THEN NumberofShips = 4π IF Wave = 11 THEN NumberofShips = 5π IF Wave = 12 THEN NumberofShips = 5π IF Wave = 13 THEN NumberofShips = 5π IF Wave = 14 THEN NumberofShips = 5π IF Wave = 15 THEN NumberofShips = 2π IF Wave = 16 THEN NumberofShips = 5π IF Wave = 17 THEN NumberofShips = 3π IF Wave = 18 THEN NumberofShips = 4π IF Wave = 19 THEN NumberofShips = 5π IF Wave = 20 THEN NumberofShips = 5π IF Wave = 21 THEN NumberofShips = 5π IF Wave = 22 THEN NumberofShips = 5π IF Wave = 23 THEN NumberofShips = 5π IF Wave = 24 THEN NumberofShips = 5π IF Wave = 25 THEN NumberofShips = 1π FOR times = 1 TO 50π SCREEN 7, 0, 2, 0: PCOPY 1, 2π CALL starsπ LOCATE 13, 18: COLOR 12: PRINT "Wave"; Waveπ IF Wave = 0 THENπ LOCATE 14, 12: COLOR 15π PRINT "ASCIIs in Space!!!"π END IFπ CALL Statistics(Score%, Ships%)π SCREEN 7, 0, 0, 0: PCOPY 2, 0: PCOPY 1, 2π NEXTπEND SUBππSUB YouLose (Score%, Ships%)π FOR times = 1 TO 50π SCREEN 7, 0, 2, 0: PCOPY 1, 2ππ CALL stars: CALL Statistics(Score%, Ships%)π LOCATE 13, 17: COLOR 12: PRINT "Game Over"π SCREEN 7, 0, 0, 0: PCOPY 2, 0: PCOPY 1, 2π NEXTπEND SUBππEric Blanding GAME MAPPING TECHNIQUE FidoNet QUIK_BAS Echo 07-04-94 (00:00) QB, QBasic, PDS 451 29726 MAPPING.BAS DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"MAPPING.ZIP",4^6:Z&=22040:?STRING$(50,177);πU"%up()%9%%%I-%3n]]AY(80]N27%%[H%%%/%%%%wj%firj.Sy'yW6)x>oT]+xWVOπU"xV^nPh[GRf[.W/JF0XvQ*jqG$=2p]<Sp-iiep-->0j]cmO'Zg(8hbp]TR0g[(9(πU"LorQ>b<rc\n>+/Pnj&$L<)Q,o9l(EI7)+XVqoX5Ad4WVY/jFRo=Tg]9P%$Gbff;πU"uNjB?3Ow1d^0CP:_$X*c%ZY?RTcmW_qcU47_Kt,[lLo/wT(n$za6ZpEE*Zt8^#IπU"[Tc/eN'(W8e3Q\bSA7VJFKvW&Nv$iHUb4(qHa]DdOdd_P_n1+N$?^4DR+MELTzuπU"/a1ANV[VCe)_Z/w%0P:WIu&S>?0ano-r%4UOfg$DKZD_eF-5(\=L5=rS5dYE1WcπU"xEN0x)wmi)M8mL8[R=Cf/eLBG+$hQbxk3:xH>1In6p$U.F8]?p8ir-Po/SZ#0SDπU"W*1=snT&:71K,SU8j=b2\T4N\kUf[RNOe:72PdC;/p>/=4oAa6c8a3#a$<m77r0πU"vBNoZje'.RDXpSv7\lLD6PinUR?R]e9cw:d4*i^wJ=4nh\qr(0V(GUc24lL(Dj3πU"gXSQnm=Z6[rLIVPaRM984$JLWUUw?W<X$KenFRHZ^=uODY;InL\77kj.*6Sv4&JπU"rLPTj5vB;Wi6UZBie=ItbtV_e?i/:>n<$c9S/]vGF,PDVtb:nvrYEusr_Esr_9?πU"2,EbV$IEJ=BF6Yg11M&RjjHBn^[Rd4'=aS#dQ+V88wT8:]fXDp-*Fd8cHHvg)o4πU",8ecDObgzkNDC\3?6w6/$I3/d/8.G,L[y6*OPh>24*UyH^KuIFF05?RY'Zk;wo]πU"QTo6.M[b_=Ikz8CxZp3EvqZ$Cv<xDsUkE;bx_=7.&]:Knb\Sf3Q?H=PT;nSwpLDπU"5p#sm8^?nJU,GIzUvwmFF/BjR%MiKvcveQ0(^MjGBJi.f^ea0?Pmfsw*DDhgRHvπU"tNL_mV;KnVESJ'XIUUf30bI2hjpKZ/7PWHoOywcS'vU>rQ(#Fva9?4xId9mRuq$πU"<PEqzoMMU#a(<X=Vs6'?#>H8h[8Ibl1,#SnUa&-Rr<1+T,oNRTJ4>?f:LK^ppPEπU"0D?As\0LJ?]uDNfEkrZHB4F#mWAG?%X]u0mst.LU.38Bd/h6Ln+=,h0ZkZirg7)πU"P;RR\\nVBqTWB#hvhn^^w,'d\g/h4]]Zw?,uZno],ZhqVj60Xpz\:f_]HeE_RAkπU"D=ARNI*p;DCQ$%c^_FgN>qpTFN;kbs;EKTMvM\DJ&g8GG.x'n.v3_0K&BP5+cx-πU"dRM/T]&qa?>)l(wGI'X,>y+2Yp&Nl^;A(8k$4rgl-;RlniXE0bIyF#$U17CE/zSπU"00#NZQkG3/w6F0A.Dq74]WJ^2[>b9.sME^+.B_^Ud1?4c5k^2NkDc<ES;;yMrHpπU"htZ]b*$u:.JL+/)ABmz/Sxc_p[+KGf-qqw6T&WL*aLw_>VCO:Z1K9k4/(Sg^_>rπU"%HRCa)ovmbG6af>t]JGtYp=)vTpL=,2OM.5g.jc0i4Sd2gE4doptL%7-&o1)%89πU"n:.9,Ir;cG_ACV[&_c-#BTjavqS6#noD;<W=&\Gukv9_*_p*&Z:sb/YE:Ctcm8DπU"%[E$;6>E;61tb.0N[d(W>82_WDfxOB]M:Sk([fFHP%.I_Y?PlhnA&n$cS&ARgr_πU"Rn46v<m[_U:bK0sXxM,hw[C2Fv&2[L?jeUg&=e&f7JM6S8WZ;7X?>%=Ql7FTe/=πU"ZZ3t[fY>?0Q%-+%M03OiT=#>::+]O.nU>7gxl$;Ap2(tPT%U0&-Gxy$Z_D6LkbwπU"Wc3]vZ(KpI/ARQBENY&*6NG1bodFm$L/HtlA#Z,ll^-XnA%:7JnI=5?I.NrYDE8πU"<i3AL;)yAxYW4X,A&bL$INID/f)n&O<OjFZ\;KpxJhr;=_nHUI<0c1nChomtv1dπU"kA:)ff4Ug:Zvqka>MO:O;h1gJLj&\?\FXsh;fJ?8DXbM#M)Z(B9d\sf.jTS$rvTπU"J_*ryW+M=SJO:0xnNRWMZR&bcH6W8_rI(bIFnUxLq1*DLl>:?cjWFF4corUzEg]πU"tBIn+lHd.H&rE+OEf39)hPtW&ca_QYdC$apgR?wKKpv;Kbftw%k:Oys(cUhUbfIπU"7^_Rlb\1SY3lc<(&Ll4wv($1DE-fE)Z7QMg1_(5.G>TOKz$d9$DUu&e(a,1Y*EAπU"_N4TSf,pZw9A,,oql4IJR<&AkKu4sw]hZ*KY9J#Syg#*n+o,3<zj3(,wRBRft-PπU"RYW('$$BRi$,GS*T2g4(%Rn^WB$--h9%E1OhuSCrP;?gn2TAA4TgLPr-bvxhFaTπU">EpREUXD\$?td=#3ed5g5j2B'(SV<rB[t/d]sr\G-B;jccMW4q>JNf%;;#xoV4/πU"$[6vM8)X9_\1]LIohY'[MIiXgl3]#exEBXY=f9amgx?Bi1B,$lVQJPL/DAX%AmlπU"L/bdXI1U]ps5pVqW09,_a\kP]Lpi;5+r]qu/JZ[zx'XtSTLHa])UfD)Z$.**'%4πU"1zzW7jqEf+1:)#NRZdnc5:LKmmHuG#:$%1&8jx/Oe(o\i8ro[DJuw:hrDY=Wh[gπU"ao82TBvs8R=DIK4(:+NdImD#.3b1VZeC/^7.oS;v8we*mI&lCEu8b[R>BjeMk+0πU"CW8R8l^Ma-&D26&hRi6KMsn:C]pciF#1B0[J3=1,ILi6^TXk8uml/kpV_C4S&=(πU"WtjO)D$N6O8GZt8sAEfTb9N9LyEi%%)S-$$6g?])troi/3R)VDrqGoZIo>1QKAXπU"EsXQB&^4shKU<o-)_&NkK%u_hxdVk2A9%1G;A%P'*^Trk'Ye#K5a0o2rewY+2NwπU"Z,2)weUQqbVaM*v0Dk:#_iw;16O:_J?Px#zO/b+t$(]lsb<kk1r5/CiL2xCwo^vπU"d*jzI.T<]ooftv(>cD-E#wy54lC25YG[NN+JWyiA3*OB#l*mhNe)SFS?T&Y;NY<πU"qS2uerM=uA$<HQ_vUCu)o<AL)X:_3$.p219c$gfsc^:=zS-_.txs0>&3<Y_MK:EπU"._ZW\'MHw5S#vW#vN<l&t1U<KB(tM[?zv=<8cSP['5os;&cqN/o#8.Q,5'6'UGjπU"f$D14g#XfM:28\H[=SR9gu'9?'uWhf6k.\Y\BwF\%mTH/fMs,9Kd2nxE/ZBN;.=πU"_[2Or$<)Ep69^2V>bd6:Q%IHxi0Vrh[r7p^)w^SVcT&mCakl-OIiB.Kuc&$[[yrπU",5InbEP+KqCI_jGbQcqCe$=vpIVKfKshkc;H'ao3%'p#v#9)La8V=jnaKi(<%RhπU"JfO9h.$iZ7&4Z>Ti,TF&nbeY%z=Rj</_OY+wE>(TUf&3w<Z:u2a;==a%W-D0Va.πU"_pw#QPu8JW5HS+8g*3UG*kMS9XimlqsWcwKxmlY_Lsym'1qcON21E:g-7xqpC^qπU"\s3K+UJ=8a8W0wj4[.C-9fSjL,NKTHcf2k#=1Ef0?fJvN4m2<(f4/b^=*?9>zZ^πU"N8FGvM0:X^nuLY,GbQBC65<$?Mm]Gm_?c,scV/98,3ZmO/;Y/cLq:G^Wa?h,$moπU"J,ji#X-9Ikqqg-uk/e9d.'R-jR*TnqTD2+D.6'8NpAV4uOoR*i:iETRCc?SL0YiπU"9fP*DHCjrC_eH<Facqu4m^Qqlg)FB;-eWr80gnb1x*+WJsvBNa'X3P+$<L9691*πU"tA/8#mzoYgJ>fGavg-'<71^ng/(dg?v_]WF02'y]w4CqX0/'s\MCN&Na5\dQ;P<πU"P%L9G3qTwH9n.0d6Mi:+N=UwChg%5^#txUIMC8,Ms=R-UhrTV&Bj;HCo[xcN/bVπU"U[:ifG?BYM10BEPInRB)L(d\5MikTKf,^?<Rd4sD(HgXKLd(aY\KYuS&:nX<cBoπU":7KcCUO^C7Bbar6D1j[iXw$>L/)Iza#Di<[$Wqin\TwbWYq4NOTx]rVb5gKiRdfπU"fi[QIt0.n:3sV9$RTiAuYcL=MXsaQf_1IEXoU$\',rLMfJl-fo4JpGz^OSS1RiuπU"=mJ-2:HTo4ZqLbLeq*Yuni,2a%_Bn/wNuV6/):'VyE1EPZX=C4AhJbEws$.pvGsπU"9j<?Q_$ecpjs*B0n.C3G?EQ=Z#Hq_rfiw:cFkb0WbMAh*&PDc8'%XP$?e#r[,Z<πU"\qp$T+y#7[xEZIlxk?=jOQYB=Zt.-6CpONP3]_mZLMtoTRbb(;).Bsl4e%a$B\=πU"JS?<1U0s^W\fu:F+5gE_(-8d+O2P\7t8c\0i(HkQOmRcQ'.Syb^H.ue]kzHCFxHπU"5_TAKXsa#D9G]Gv.nCrKj=CmQA^WO&W*\NHUw+rjf:(KhUpJ3a1iQFMmlGSfoNaπU"LJUDZl]5QHXlY1MfqTDiXG)6Ph=r0$q9$7bmM8_M-;9%hr59Hf6o4HjLG9F;PRCπU"201a.TDGcSwU)<2-^9HaYpfI5*6Tp?PMY/,v$o*yLZ3oF1j/oa++2T)j4jvsc8-πU"$M.sb0ro\nS-1Sk1rI,g5%*u<.jYUj8cj>O.<cU/tB:GF_M252D4;3DoqW5Dw\/πU"EKge7dLj)n4\,tl0?X*\V3cGjgNFFt4;'h9L25Rj+b1E.t$#6X6x4er5>njdql8πU"0w%(up(%)9%%[%-%&bm]A1YH.Q:%l%%Z'l%%0%%%%r%fuun%slSgRfxML)JBH\;πU"a6Ur?=uZ-alUL18R]Vv,34Iprcf4T%CDjv)9]JwIpw=8&1[[eR;MOyG'Y;YZF_?πU"KsPhx,>#$t534n1d';FX&g9YsMesQJh<aVqe54Z$mQ]\f(Z:,#KbLrjiQe5M#iJπU"9ngOBNJ;)FfZd-jBY6Uq]QSLtv#IW<GCG[K]#Bh[#E<(LQ2;0eGbHqpcwg59p+\πU"KJTs&V<5j_#BJa\-m>ZE2sj-r2CbmA*^BrO53r'%^FoC>^D2:DR9?/62RgvDnC8πU"_aibZrRaUPRMUC2v#-%QuktQb86tM0NaVn,,Z9REJ\(be8CVvpg?K=;AuO,)/$]πU"MD<rg==TmiYVH%l?sNr>g>2K*S1WrL;[z*fVVm\H.Li?IJYX*9:wBK^WYlj__2dπU"iRw^D$KWYZ45u4cOP$_;c0B.j-_%T>LF2#g^(J5hbisP/s64Z'i(UlQs/#;]$;\πU"igg%bvWi5I&qDrjW2W$_aj*6C,GUfD*-rQ$Oc\0[i/#s^AnImj9s&h_-k<-&[auπU"Q%L<l?/SnX>'BB3&2BrKMR*tGi8_\ral:k,VCV&LaF6l_pdE#dH1R]zDFjbEuKbπU"+Wo^vhdPbDErZXc-J<syhC?ln^<3_5?D]Om)HgS3e,fc^nOE,[TmV%:.A,r\qsYπU"*b#%RSK%y$XWY0RRh_,O;+zvsF4OxafLh1HeB7xCx$8h<K4DY?(G]54M:nJ1'6aπU"lRlaD1S$BlkW,yr?slPH^gl#$iPTAe=JHI68:yKuf#QSWpVcWmLa#,QL9vV6U>nπU"'bxr%J8U;vmAt0rikI9uk*O6u2r\l6*kd]*St[qi%Ih8tCTSsc.LeV,52To.wV%πU"RFHjcszPvW4>ur=0_tfmfXr^_W'fl;T^Gsx+V_>rdwV,D6d_wZN?1GZuLmmGkHkπU"Uka6Td.TLJ,TQPw#FK$bJbNniLEQJfkEud$e18Hw8aoddk'kSJn-iSL%XZv,6:uπU"ifggF^8:Y)x(KmjikC:ackQ_SR)]CQG=v8R74l3':)CeXI_rf5.%]'u?pMCEZ8KπU">[Wc.Rb\A:D4X:B69*I7:Y?w>8(S=i+r0jl>jCED$X'P]wWW:+R+$t\D_Zc3In[πU"TYEbY=UZR>-c'9xOLEN8z:KbeD.H]\Ftm_75o),L?:nTkiGT6CnL+q9g>L,KhSGπU"T&y^Q6\VQIS0/QePu]/^m3xv(Da;S':)l:HfYS12ns8[1tDGG\#yy4'c8<3pe:QπU"uT'9>cxXUd'XrwDh0k/FI0k*85A%YRaJk'6L%adp?VfO*L*NkI;eff[0QHh^qX8πU"Bc&CWeVe/?8?cbWO9pjkvF=:c#4]pK=:2hUiYB(??Gd<(U&iLr/*5s)AX+7:M$AπU"Xac5zAHAgW'3eKuQ]2H3#Xhni]?w%bvU)vBKRA4#w08i19Mv:H28dxmpdsf&[R.πU"#9#4Y]$u-)P;UasIF<A\N2S5YZ9=]V-SP#(pHmUj;Gbmi&LbA>\Kv=m:&qWqC(1πU"P6#l%NN&nlD;iBLV:+,rXs$%(G>,6+E6#L7S)ZBh#76OF#G<hcg<wcBp1sR?3]/πU"9Y2t[\^,w#Ue:5.Il'qN:Gs7J_MH13z;%EkW8A%z<;LC:9i;qk<GA=sqQqAk#b1πU"qo1cSYxM6+2Rl<C3FC+rV5v1fNc4vTprQ7c)=BuVOq\$8doe)HkEnvZ40P=5-n(πU"G3^c56*3QXU0Zx%B:-gLA#?h8_Yu2=nG$XYx\cti]=)DLOA'1L#VuAYLAmIF*n?πU"5hL7q3qE>(9:7eX1^8Bj'nPlW9):[ixx2E=nu)+qq2?nJAt;DdMXgGt<VK&6[fTπU"-m^$=,,fxr85]_>+D_G(c4%\Df=C:*)pkJ6/l7$qGT*P/ZVj1BOdG4ECP_>OL(QπU"r(L3l2B8mRYKBRQrp2ZAUhC)ZkN%wxc9D=ZeJVBG0]kj)2E^ziC#[r5Lsj;_/X8πU"2<BqPTsy^IMjC^\O]CKYE,DxNA[Tv7nVG7WQQ:W-d:#$nXkh.YSW\1X\LR71)ltπU"F>6jF]M6xkV>3<jYQ^e%N?Ov$YoQmcG9gVofAN6MEUH#=xAu;Psu+00#aci]PdbπU"v11<#)mZ8iiAqR(c5l]lQwXDRY1b\z#4=6Tn*%jS4IC$72,)mN4ohoSMIg-3U3;πU"F5-Pg;;X,d9$0?XYg#hP*J#)h_h4E=[K0[C_1$k3iDx8(*[KkXg;9IAie&%=8+XπU".m>BwBUYW\[PM/Qz'8.2',SgkVnC>?[m^%;Q$UmZ$;-C,aCfG7mRC*68m9?xv2#πU"-gyi\?\&,4'0x]C*-7PE7NIGLgKRiQJ>(v<X>.t4hIYe5C;<Lh/MO5BPR*vlj\1πU"#9bR%#*g(JL)Q+28dbSg02PQr>/k1Ln]G)A3AYfi6l^jS%W>cAxE>;/9F>2&O:.πU"0<MBKlvCD5K_]SV/%DVA]9-cq4H'Z[ZPNg\ZV0Oln-zZjn>#HhdD^S]$6_8]AaxπU"YaYoRNFM\u#8SR(4a%IGPPNtQ&\K>t4W:r*\#SDI2eXd6#]E*GG9_KTBJyeoZ/SπU"f5MfL7E;N7.thJdiRRHpuE*M<ZtP'(NHGA;m$/=ZQC=$fOTcW0?%QJbC^k*fI8rπU"BIP6kMlKbHkVR.''(D)2mZ5TR/ug(6(J<[3T;nzRJOrU/8L/[KOuK$\)p/O&WtIπU"MP%:(v+&vXxO,seg\WYl?UNzh+kxRS=ZZTNx<i-1fs^D]u(B<g554B;'21pdIFXπU"YL6JhM8W'ZzThl3[\wu[YirVZf(-PNlULZ44T]Lx0woo/yR&N)yauADr\Fu,=w7πU"lmbvKhv>Nw9rIwMMoBU]\L6bcLjh-hu;X4*]0fW[<mjVlM%X(Lj:KeF0=l$N466πU"2RBq-pE5<%Lyn^'D..0^R(\?9#2UCRqmgm'\SFC4+60YqPaD5Xq>pui#bN&=u8_πU"C0])'?2XjOz\GZ.I/>EC1AM(_O#-SoE--/IB]Tl)LTOv\O\FKT1eY45p'?bW10;πU"dUChC6BJ'k[;j'6hu'3S&2NYx#EsrKDV\.a*eknH4b/YmM4D31GmK(c8QswM%pOπU"-xv3,\mXloLDjujTVVldIm'FsOM$=OITdahduLCONhA1B%>EKA'wC.$DI:V%Lw(πU"\9,PMi9Jy?VAm[sMoC0nPJvnnZfd8<iKkhvc<Q:EZ>NK+5KSCOM%.:ubqJ^4:a>πU"pOL4o%LE6=[K#g23%:b?,7W[J?]ciA2nr1ON']RAAM%P$E8J9OUH]uvIYof-S3iπU"8E&m?s&,XkrIG%%30oYU_66iuR8PqKF:;c^6;+M1c2Ci]EKxibQuHej=imH#7wTπU"cc9l1G#8H1I<G==X7'3o>gto*&U9Tn_%P8x%*6-R9oqxJ)Xgp4M+l?HDmmyw+F.πU"Hvt\gKWH-b]lDX5shC-0Ze(KJfbqb5<V10alo*5q/\lCMx3a^3N_-,\cf?8kJG]πU"5jc%^)[W8(3f(\.0;4<nOO<WvN<Th_%#NHKqbW-H&#Qxb+=[by:>^AI:+\:-LWoπU"5cPt+aS.BHvzjufbH%1Qhj4K?W4eBr4E3nF3IeoV_#2?)4M8uY6#pfZ,l=dx)h<πU"l4.Q'vHO8aM68B^HJq;OwYf4K.XL*&%TxHQAP8eR$ZO;hrI?;Qsh*%g\7n+qUM,πU"<>yh^yHaGl#.)qmm1*QB&S;.KAY>(/%ij'H&fcQn4o[Cn;=_N_Kna)o?CeWy^.PπU"kE=cBeBvuce+1-IwRT_816PNXOm>J;))3N<#y_]v,ZOR:YjGTO]<[Aqv=4>ypdQπU"#,LN,2A'R2j>$/$OM?Vhpy/r.4TH':<SZBYV._6tq+sCJ5wZ5pKVI#t9[#1X:>7πU"N/kzM+Iq8iahggr>0$9b9]f>:?#W1o][S-HMn82d$'aKJ+H8or;:\)lGLoxHrB_πU"y&tR:lmEiY<.#phNVc;&L\>DD_Q2Uqyj-Ie)J#GE?#sa((cd$>Fsnt^Xh0>Syf&πU"?Sq3=_MRbe=j/w2[j&I/Y&FcWkV3]6F3-UAW3ZoZh7T+j2Pj?1WmK^sXky1N\qCπU"gE9O,O<m$\Lfrq7$&b(MlZtfsty6FLZf\#2Xc4kB'/+J#\_KMSjp+[X3++FwjqAπU"e3+GC.2+/[5t>Ye+<$Gnb'.ZkCq)J/&ugp>Yc(K9GQ2iADoDg1QYkwBoRc'O,/vπU"e9gr6/Y*GH3sPV-?n\-b2(>nO5(Bfj2C*pk#8kwW:-&)90k4hE*hIl<Rn07XtuCπU";)Nj;WXE;5w&rx^')Z(Wc\7uL_,'yK?TQ6G;A+wq+qK$gmhUs0OXm9B6u*4EHxwπU"C;*dpmQJ.Ucm.8\h1>J6IWQr4uq%24HtmfeehKwFT:E.dlblDc*kA(.hj\HjfSMπU"txMq^Jf,1[h*l4Id[J&T?1C_G?I$sg^Ol^h%WE6&E11nz1#)[9kcS#Hm53c:%2EπU"560(dj$45f#sDs+#EBlQ6\:weZ1:=*%,vfm$Z(q;IFgm(X50Fu^M'U?qCKSfM+-πU"_s/r$1$,]_cEg>o$N2&i&r*+#7N6:VTW:djbs.zUAd#%po3g:%LXE51GY_BhF<6πU"P:0[e1X2iax82$=]o;M,_jpbY6NCN5x9p?Q+CNT(\VZ5hI/OUOmQwUX4:2a&W.CπU"N*32R[IgdqB;fp1^M=mF'U:F&d\r/]*^j):U2Ob/IYdBTHqmv)knV/2w2o6ub4CπU"jiwY?Je+AkZ(e)X8K%:_P[ko:D1mop:3kJF:?D0C1,PA?)Mh2U5r[obUJMK9l0kπU"O;n-R=B[.,9wyZnQ1=Go'Lv)6jqc_.B9^7L&[:fOEIHS$VX/o#JVtvh-]<VP<s;πU"eW/6,Q/&3Q]5[AO,()/kw,#]'[oO^QcXnOJb8Z(pJLg*;uhqv>6poq$wDUTkSDsπU"kkPCKR5cPPM#Y4rx:ijj$f<br+DPYs*?LGU%ZIRKJd0FAV-e>c:F]_1k*hoU:rwπU"N?nmlFJUJ9i1uHXVo1eKwZ=hIF]%w&&Z(6mt9wL1haT+OHMe,AYjshqWk7S2PjkπU"%ZwU*w_OZ;ZmjJ1OKD*?\2tNO_sd%b8RV3,vZr\X#A%%En$W6C]c9#%-H&:PLl[πU"9%9sLS$GT9jE%)h#Y-uMM;r1aTv8W22ddxK;,tqO&3,Z\4>%s)#%3h.avhZ5foZπU"LPLx2c_5+u$Lo7C)Ndo*T7%5M<31m4]C-dfm^kL<]:INC[0%=-=#EX+dTI6,%PcπU"-3+Zs+I3Eqk)8%*<gx=h2b&uXx%7=]A)culJuA9j3RBokQ63(<Q:o2MJR]K23pNπU"4qN-s$A>Q]/Zed8gd+dTEouhhw4HuX*VVia.pV7gSluW:<PoFB9AB,>;Qk;_(b9πU"n$vWX.mN<HwNp-vtZ3Az0cM6LIE<cWv*w6+YdHuphG<Zll8Ocfrhltin'He^_66πU"rx,umulXgaBU3uJrfwvmqJC6WKE;E0Wxq8WbsE=tFBv96(.G\20.LU?+1[P?]=\πU"*.QxIfwGk#>;mLy0mm<=Lke.ddsuo=mf74ifrCf<l.>k#a+.AmhXKo:_n0DQ)lNπU"f.&eQtX'?u)HwkdZZRfL]$x'o)&#wKufN#ZV2U0%z50)V9yvC9HSi9W;NvHtrP8πU"v/5v.wSw$f-?8Wg8=c]P%O6SL[PF[%z(j<.JaYawGmpI,U^%-b]g6Q*>K;%?Q3MπU"GT%.?Ehx]>%.24,k#3_E4mCi$#vic:=[YDu*G3[7kOk4FbyR$I+k].HgT5ew=C%πU"47B7<+gn-I-.=]5%GB1-n(zT1u>:sLYnLU)[po%7FgIao5P\IhKGY:7XfaAg)[dπU"X^B].O((U&:eC<Rnx0t=v6DO=2gBCqeoCQH1uf<ZiS09qFGjN[1s\^7B5,rLq3LπU"jS09,6,t;,[$^]j$i3G+;s4OY=?=CKPMil+qUeedVs>WP0E[]'>mqjp?#ki?FB*πU",dCD?Z4=-fb0;&n11vt(GV[48m%>1cItasGf(s.xW6c4,z3=m\*&^%P'ArI5#LcπU"u_T>X<\ej57Ug+(Mcr#Y\D6F5JhOs-aF>_QX.jg/'2IKt]._AnV8BeVMp_D/0=cπU"nqG>;,0j5RX94AsaB5^4-g/7tkjf50bM_H2Cc2z1V&'8JrR3X*NVR_llMHIidCYπU"Fu&iea+Vwro'%tIH)+/k9Q#S]uXPW7qHtMJ8/nSSHGHYfFB^]xc+=]ef'*,R3G=πU"uDEGD=uTOE1A364,SI0afw]#D*Vq=5w?/eZFmvJg$gr,bIt,VQv$V:4TJR^.ki&πU"iSw4HFk&e_FV>.Yg^whHLJ$4#c*9hnA])^Z=->Um)I]E.P7&r_X#UP3<2B99OPBπU".2?\WPAmXhlswaxhC,Xk$ukgeRj+S-ee/0o3?*,IhnFB6:0C(sptw)$B(GFmjl$πU"<;^cRc45-R,#$h#fo67==Fd/s-Xph#g+3XAWJK&a;x^S(9J0BUnlsFPs$.0e[yxπU"0R7JudH&XCBOpcQqO_Qp.G#z/w2FuDm#-TdqsM[F-.C^_aZrU=25:%N<\^TmDKsπU"M9b)lx[jvj5.JqufFZwB7>8MMKL?7.TcTT<ondPNj\=EC.>3-8V1TC05/(4lX5+πU"8b;4YDk\G#,I,&Q%lt#54lXb-,k%8HWq2f6_Q*walQOHj:FJ?vvg(FIw,k22vmtπU"6Fg)QL%x[YAB:Px=(4)vQm,?KNVyZmsn%j<3Jq518_9oekk]pc1x*PeQHv]V)6mπU"-uN[BkJ+eOsj,Td]-4Y.D&];9c.pus0vbc3)p.CJ:uQhFZn4.s/]$lS[E4a2&y,πU"M6_WND.l8%nt(4lSUrJZ$TOqP&:88F1pnbOpekB-m&tn),skD,JUCaPNJrbG;B8πU"KT[u4KpVJ;AFCZ=,'+30EGL.1wnU-\14nbJs1sJtWNTP>m#9]'qV$/Km>cX*F2]πU"O7/,ob<Mm81$R'eAO,jvos73rIIY#2mKW-oUD#8[Y-lX)JNg-48u:Snl3_r6U^)πU"DWcBl]t;]i>aSo*%P\en5^;K:P2CCd/XvIQ^\O(YuHNDBTcyIc?M_t-#iDj/FHXπU"amfQ_$YQSen^T8atPZRY=oYnbh:U%U>I:J9+.CI%PKHCe[rJ)Fhr(UJ*WBU4,^qπU"27B94qNAy9P]U%0Y;BiP0:^>[6Oa/v'hNLf.+IA5PGF]_G0hNa(=uLC+hF)AUOiπU"f4Iag<VGBDJmIQCBXQ*Xy7uqJMQ4UcX<#q8q,?Tm24W:V&,VB9u+WyMM*JbX]%NπU">QNH)Nu'<Bt2:gj%&4%]['QEJp[JTeTAOo\Xd%k^[%37$f[taNc,w,4MA#1(^i=πU"E\sER(NhVz)5z\P4sxAU[&q9Xfxhl^T+12ch%ZmN-o;a>2Evc4S=nP>2'fE65<LπU"GMV8?lJoiviDZ.BL$O=M#y6:3C>h.o0^>?8?/E[Y8.s^=0At5fuGO]*_;o*pKJ7πU"36bloN4Jh.tEsU/Q<e*D#SXrNLi0A>zCcP9bEDyfZ?8%ztZtmUc8Eh:GP$(JZQuπU"QYRm8kre]oG-2l8ezY-jadCRu:D0E\/I47X.R:*PEJTs%SgvdVxQ'Gci_zf>ld$πU"*M[mx0(+W.m12]On?8u;wX.RDLUpt[+tMx[KiZkzhJ>:^-/8WftLRW?C]^AAPSVπU"5MGGD$I)T$-Z$UvE4m^&Tw$Jee:4Ll.T+BG=B)=^ZJ^a1mAjoPJCpurQw&Z[HO:πU";kB,;)V]%Kjr+9,WPw:e%:;J9qXXUJM,:MYDBu,v<q\)p92D+h30gVTrh'E$PV)πU"e5'O,.t>>&i>eOpMf$^]*X<&jl0KS3f_$UASK9RB?%E5WCxI>f^DY]wM;Em*deQπU".xdWrm^&_O,LdRp\gHo&aGxMOl>vk;L[>AKUY]zm4h/h?p*Tap+\fa?%Wq&FrO#πU"SUTLrTMh>Oni;#;-W3PEB.^VeV>q&MiGOvJbCM3N&*Y?vn4aJNkH,m;N)/2-LKeπU"yKq#>?=>L&)M2?])LHpge<'LZ#RK+SRymDWuHy6T^n<Em_c(;m_uUVjq8)BfU)(πU"#R]^bi[KVvrj<Ff6i<>g_%?K4c$ncGA(BwEApt(#C8vUg'\3UzN$QLG'X_(9TO4πU"F:18n2&o_cEKmas9q2SgzGX.1Ord&PPBBT9(qgA4>jiuTEdS;TE762:NVB[%j+YπU"-mxv-qx\^a>Vk3Qam)cu%u7RHqZv^7k=F.fe:_7V-5.ZgB1).IZA+)%[0sQ*IjOπU"QP;e+)Vh.Eil<-'.2df9Z2SWp^l)B[6At[n#&+Dg);ZzsrWqu?yY,\'NpExN1$jπU"Uc6.:o3I']as9tHK7uqqD;E3[0O<,RQJA3&Z/h/)GQE+VlOQ7W':p-8SF40SHUXπEND SUBπSUB V2πU"toiQOcZ6?ZYH6NEHrfElUCh$^I$U3z1GT;Dpc)RiUG3(Ytrsc4O/tYlun4&ljLNπU"-8itsInW-%L.Uz'^lQ(W'H:\dd;*Qm>PQM'L9qA8rgDWr#1n/]tmAWEzRIUi$y#πU"4GYO2VoDw5s%qOh[plp\l452CjjJfHa44XN.q'p,(a-*m]oMAg-\/U#JZ]3^nLiπU"6^/p.sV=eoF#96eqk3UgKd7JX,?')=7%>/W9;C+R5S^uFm[m/BS\554T/NM0)f#πU".CVuLviC&*uPe4j%#e+83+KRauW8_I>Q?nl%#&\=8BAr4nD*GQS5603R:eM,SqrπU"jfnhv3i[/gZQYk1[pX+;Yl<*SsE9^>fpYdWRkOE\^\:sa0<hJi##jFYJHG>5s=IπU"ZDu=C#v6d$=to/$VwKto#)F,9h=7(kO3pGI:^OY[u1mtN89<YFFK/W:b%%9SW-*πU"^W;SOQGs/TCX'NkV]&Qt5]<H7icDERupd+rvB,T=F8YaJ%'bc>Y?O*R=u55GkFMπU"t0HEPM,rJJWSc7LHrG=jM:B$HQ=[bb&]q?,sE?C#Rt3jI2BMTyC2Lk/.[IxZQ%VπU"_kRH+A%ZD?R:De:o*NTs9O;*SqYrE:?=v.ecq]$.RX:Nj5(aptvB;L*;YXj6Qq0πU"opu/TPg<Il=pY)lp?L2]DTl.W?Juc(urIeb9xdOe5YG2mWb&hLu,w1698pM_U^JπU"W;t.+?tpszJ5XdmasmRr#bDagi7*(bRM3cTT0&21V]p2'n-'R,5ca2H<TEQ2ICiπU"e<M%RwZ$YFr\FO)h6S[/P<0=?_&X0[iwgW9..Jyp&jt[DH#t%S7bt:X;eYd$,wQπU"B85+6Lc*f.f[$-z'tTS:]=tA0(4)>*k8A$ahRK(G]cF=NGG4<>T8(0K'HvC$:OQπU"U/4R_1(g*;-JkpN93M:a2?$:G%6yYT<noP5NfJdsm?A.gKX62'wuaOu^Fy1#EPLπU"a\/C>E<W^\P]k3o9[u5fpran=hYBaYYau:2cE=dF<[[907(-Lec?:(FmR;E\H--πU"PObbvrZ'h/1[$Ku]uLJjq&s_A1;I$dC2<Y%n]PHV-7;tga5:L#7eI9HGAXC;s:>πU"guIW]2h(\Rag)M&4C0.b60E\X9O#(5LwZiEF>_zDDEf8.%VI)Mf2K^s]8HP0HT1πU"3Vetpi-r>Y17'MIAZ8sx7;]^q2O#FaS0,FNWGM=nL[vqOuEI;Dj-lMxBUqt<yOlπU"+5<:,yJY]p'c?Izqe;pnPVmASd3'un1T2ZiO#iQV><1&S<W'l6B[&):OM]CUCRdπU"A+=lB2#MuXIiHJPe;gu3*Kt5uQ+RweS]D[-KGH?ts3Dlnn,&JdkCh=-ZU^.ID0tπU"fERIsw9BxR'1ttt>eoeyW*jG51h+jWB?8WPs.qeIt[-+x)sJ#TF06n?-;gi?;LFπU"Y)lz:B'K]i5yswM[Smd&Dlfw.$pl0tERg0QGumNftl%*\**]4YD[l2eNxMes,%SπU"(knv?8TC>YQ%7xrj)u7DQOqqsCf-?7LrTaA+&GL9sV:4L)?TYn#LLi[:ZYQagm[πU"G4&dg5gqh(#N<2DOM5EUqDg][04/MrwYbKIDpQU5G0HD]G6:;UGGa5Or9/b'l)iπU"Aeh^$ibQxq&n&oIad2=Gh-4\E2IHn[\8zwT?5]6PsT9ZT-NrdYnV(ExBO0uE0GaπU"K*'U7QtAk,K()iMir4hCC%*Jy]4/;.5On^UYrGm03tViPp7K_Pb(AF.fzM6T>qTπU"p[V*$6Oz:%Z.j<cOhTdf1QFEKOSCwNfY8&-jP>+QoOBLus1c+t:n+Th3g/($ex[πU"Z0LBn;oSHD=<AfcYP2sWCS]$foXtM[K;6D?aOt[uBnD>)ck4(H(O=kt_+$EEFL0πU"KC4MzfOn&FUEBJvkIL+9]tW,fY3^tK*hD=MV7Mg-+US\g-0Yhb<kPNv=,OnT++BπU"ig?i#Lau1JY54Y]5R[<pYyMZzN0Fw3-FW3I%1*d[*RVs#?X,L3g'Sp-R+2Q&]0AπU"]=d>:'N.brUX,*a8AT_KT35^6^Hc*QBDPlC*'/Mpw.;KAh=0D8)XR8*?f0:N<_;πU"(T8E'0n_E1LwgJXzSUkJgZ(h],b<;OPZ*mo]:m?aZCH34dO'I,MYyT/zE'q91b.πU"0</<[SgI$,kjd4)r.Gv1xWFM&.?V3N.TDS/g#DdW:ElM;uG?Aq<(#n2oRhWGVVKπU"jmU\Q9g0H1&E:rCfW,P9>q,*cjg2kfh,gKJ?)OcNH)Og^BDvR]=RE4NDVj$jXR#πU"b&g.dtohW(YZ54(TjaeF(K6^9<mOny&sG$>'2MuSAR*K;P/jrAnG7<IDiivGgN3πU"?Zo;??Zl-e:&\07?;YDOA:2:3(L5sZ:=)wx-(rl,v',5JUce=ANpF>vC^<k6>'*πU"Z9aw*We*eIQ\(i[y4E>o)']tUhgMLA0?^4cDrdQnU(</S^]'[^7mENim0-/99D(πU"K4]jJzWqdEL3ql=5=Q/)x%Nr1_0Ja.g7_9LACXi5>L2pk'j9n=ugEf0_V\ua](3πU"rD4e,\gEN4uN_?di)#,'M=yue;E\f6W4mu;uK7)^6\'3lM4%QsJGxKpklN]q%uCπU"A4yf.#We0+dAcH#7O$%jD4Vew2^6(3SB,SER04?TYk&fXhNf.WDbRLOjwQ(3C8xπU"Pzp\I*R/\')W+(e*)q,huwHTFh%]OOOh'3g+9Bc1+LMZG#9-cc^]6U3_.U6zs/CπU"ZwN0TYbDY]oH(+m&1$5d2coZli.x2-WeZ%2w/^CQQSXvOC?xZdwx\-5m-43dhm:πU"?)I3ye:MXlA^8.6GkX1Gl7eCG+S'GcrdqcYA$9im&9-3I0j#->1?Q.7=3EePRaIπU"67D%S,o'ZMVD-OXM:YRE+MZ3D3I8Y)^4cL>]7p^X3nHU0N*Qi+AH/bu_);3'wv;πU"eI*4)-j:koDWYl?&<b_]<Cx7r*$eTetDZb&nz57</E#AWPl:[k;]tCPqU87ubq]πU"K33h/wc%((f\pLt^1kHKRcjx4Nw3kZ\CS$g%pJ5(vhh/:cpM'h;SNnL[l-T,Xy#πU"uf.ZT/%Obts_qIs:qGe&t]Te(o%T0Jc^P<KGh7b$N<uCnsr3+$u_U7))iD5W5mWπU"=fmGj8<jD:'YPDr^(l-z[eRnv$C6O&wUqvDlGT[y%A0Um&=/?Rqjxx=1a$kQ7B2πU"VKzhHcYK36SkSZIX+qf1BeCF:<]qMs78AN5l%Vnt/DCYswP.UnGi'DNHm?(l**&πU"-kJ,wdKgFEV3uSAHODa4[p+i'dua.t&7)[9O>UUasY*3:CWxN&;Oa*2aXjtjRQXπU".r/75^K#3\o1Av_.wcC=j^P>O8nJ,<d3Dem\?%Hr;T'^8TbO\?TXc6>%71J<8A$πU"X[dT^a3hQMAu%TiRC?sJ7_lEd8===<:g=?r)/(/GImr7N33nY_oA^VkB.yunqx>πU"vcu+xW00I7%q^)meF/D+Hm]bhq8k0\[OZ8b+HAC/BCFGAlcNsza2GpisQ)6w(kDπU"XRVjY()vmG(tG9kh[xS;o8zQRi%3?OTn^%D,vUu;Zgwc(ns;CyskM#NO*;O%3s(πU"g9%6d/3HwVRr'WzE3J%YJSPH3$G%rDfG*K7ipX:=6II3m#Mo7JJQ<w>FaeED5T)πU"dGc+.0YbyQ;HI%T/iK#ap6d=KXDAgJ&75n<Qos8Z7mt&?v]=B<:V.cHX/8TU9gcπU"T/y1=R<#*.%v4C'1izn47VPb,Ke%;/MH>m<YhHylb<J3[92Bp&Un-P8XgCQk?^(πU"*hMs.((WYLG1z'K([DMv=#7637'GHKk:HOpmQ8E6kghxbnHtIR^082ZTb<6]8WEπU"ktDkxG+b*t4L/rNG0Sk?\Lp4n.s+bN7>)dBVn^Z3W^$k41.q6m7QR%X&msIjJ%+πU"iACL%D]u\CiPOzTOaS4,fdI%_0:NhU9Eru4-*ANcTKgX5%NqA9lt;InG[\J(2/0πU"kAR\-OX]*cUY4(G=iXOY2l&Iyy-[6JWcE%erR%gNIkeL,(_4y>kYtU4o<A5/fHaπU"F%oYFWtM9/1Bly(ShE$#hqK^rE,5nMrasWd;UP.B[&QE*mR*E..u=+H>l)gCP7/πU"4RWXZke*kPmD=1_.T=pFDkwHK]5#;xGSwB??pQ2Q/bEOE&_Yy-(9Fn9g6Vq/:gZπU"d8][a>jY611X$kvPb+.znfKki/L.>c1;kJ_,-Lk(4r35Mb0K(=xY1s933P+]1mGπU"O4C(iqjv.%iKiOCV,CVnZ_^6X(^bu-p.\/n*l4D;M32)p'p-Xy\[Xf[^7=u:a_xπU":lEmUz9toGY\Ghoe9EG\;^2-F303Hj[uV6V*-=hD)N,t/xU?tjmlVb]L9ZpsVy#πU">zn;/dyoZ(5nF;*OP0&4,ka9VXQFZ1_[tZQr*M%En=w2Rfd\xm?>4:Lz5KgQTIVπU"2ruQU%,4B'>Si4n2kiV&Sox4C^]AFoO2DM#9NG#P?3Qak0VJiE8qGW^<FMFU%IBπU"VMR&^wSu%N4hhna/]-FX\>JI=ZIYZ;UB2:OrwEEm7StQnoKU5p8ryD.j4[o19e#πU"S)6.8,Fafx05m\eix,D8o_<6Tng=oCNcVcN[&s#l=Mh0#cL:ILm^\nZCFt]Z[H/πU"nUGujmgN<F2IOk\OxROrL06FMtg-r)V^,c)[P9\[?CcbJC5MH4dMkkG\bdf-OGIπU"'xH6Y.LRF_^If1eOA<*U/-[[(Pc]6#azS[]2VV$i*?TM[yGRL<>hJLJE\u&p'ZVπU"xHKFoOf>WVPqg6us_8Hs<iJ2]LkhS91Aw*Tp4,b+G9#w-*%I$%25HHFg:Sxx4PIπU"[Ep3mR;j/\D7iVuSWyS-m9tnSq-UDl.fz5s[fO*sMkf<7&,*e6Yn=FnEXya;3sDπU"oVqJ_FsJKLu?q\A_=eo>GwIg$PP.I]?Nv]%W(A/\6Xv9TGUSuBsx,LASPZ=[K,tπU"]kO<Gt_hxDbgmO5'P>O*;w].MK1\aAr$'WsRQ5d:*p=1$?:IM:nCVvoew2ZVfwhπU"4[t/\eu*CeKz[vX&e?K9t(daLY[i?<.*x9gPE5-2TAlUu1wswud(bsZ]GdnjbS:πU",CWcPjZ0e\STvkn,)fkGo*i;][e4:HcI#fTkP+/Cy5D(pKdlrd$LWu2O5%6U>JiπU"VQKDq4f+u^gA'kT]/:p]PRi>Tkds]qz=(lH0%,EMsa^^f-]R)*8Ic%bjEG2+:>sπU"JeHjRD60NNRMUN94vwOt(L3>l_VGc_S7/+qbmf7'SgVSo1^htC#m*4t*Uut;/%MπU"<R)=]_$-W+q&=oGG042-Oag5:KA7Pem/>/ppOf)O3(j&3kCTV[c<K)Z$6[+=fq%πU"MWXSG+YAk4AO2sN'7FJrmrZ=VbLelt3]=l3YD0FEOZ:TI]CxtFsCT\$5KliUFQJπU"j.n^#F+KhkKJm)FqqPqf3I?d+h(FgE#iJ(oh<>pP:D%/07>h5a2*1R1e/YgXMTWπU"0p.uDl^ruTBp^Yd7#2ni5u>*W:bJ:rIN-nD3rYJr2ve>ESo/Oc%28d>0vq/icHKπU"r'NY,?Y;]jnbQ#g+j*?'mosQ-UZAfFK3#)KOp0Gw(n*w)k_.ZZG=%6eSDh<T%K+πU"Fq=iv<hI_<pZEU5s[3Y_krY(l#5KP,z;aoF82kwNO$W^0ow0g=j0.O>/z[h1s-.πU"U]#<1DK63CUnwLd)Ck2-9\B4VFgx<SJ:1R5/;vF]_hwf*]G0#<DwHWKV:n1_dB5πU"SVRT*:V[+X]F;j$h8vYmO;l3H45:THL8QsBL.6#DwepH?40Z:p4]g,d/3e^Pc0YπU"Ir%lvICnTaD)MDxkxtSCi&2Te-5R5At<BFy)='o>4ZieC&]NCRV-HUj#wLC6;XEπU"_^&&SoN0bnldv%<3>\<02BGix'W_xvm2\Gphhi0687_'mV<qC,tGk^+7MeKM:O/πU"<>Mgy+?\CN=;HoU4\7R%kq*UWqFpJ;6#h;uZlB.GmrqL<&f(BE3S\7V?>.h)hshπU"TWoq'>32S36Dgdbr5e2Q#L5f*bPOx_Ln+i$A9U3k4f[,rh'\#>%NM]3tyOtVV;8πU"%\*DDnuOF]3iRWdEL;Mwc[><m*G[DegH+/%9.AqpPR_#$W%Yq7(&SVfn2RA._)dπU"(Z7+O7n0btR^)=1E=ORgyHrs%K=b4U,u;7*+%[&RD9;P\>_O$b(3^0amTXJ^S?'πU".A$%D;Z2l(qZV]IW-')S>TE:fj'2G<MhQ1K#+_lpF'tA^B[&%5RseNkgKo[B&Q>πU"B3R(q]co.soo+1Y05/GW\5ekjIc_S?6FVzZ,%brNd4nuE6lh9hL/%DG+)4+4JmSπU"Nf+oSWf+7]nU5tGiSdZaq+I7p:>vE0BOAl8jt=xnjd+0C,JuheG*SM386vwdk$*πU"=9$a/P;rEE?%?Y7_3I;#KG(=>Q-n/YkqvkjJ9pT?Xu<9fCP$76^Zp+?ytLs<wheπU"EyTqDO>RG(t]Xe.q<b&89#ubRn+R2H2arT\milAJPc<6v+v,JQ^VZ20Qvi#[P<rπU"/+N9B:;%iM*G?t9#EH82X&pwI+=;7L$'iG>1t?I_V2sY,f9+Lt=l,Uj0j_L83XLπU"/%g6-]mE_VVI7)aDH(<b+-=]%Rz5Kqye9X,q:]fHy;G/TxL\FP/0B1b94/Q_mE%πU"\p+5#.AT$AIB=8Y\*2lJ%?GAnGnX/e/EgieMNaVE;0sGh]mln=--+d6>lE=/G*0πU"DO\)d0+$f94#wW463kn#y+3,#,,VlX>>X6]+X&oj)M$&p;Y\[,c-ALe4+8)3xhvπU"Yi+8G.M60tMa*,(i-vf]v3dc4GrEd4xr9;VaA91%jdF5VE%].gvPI0HG;'nn,hQπU"+T->ag[P8+r:4xsNvdeUJj5l=t*cgIDQ\^9I7kO>PpLadb3.0,<7AiVJeXd;^xZπU"KARpsg'(vVh<9<<R[LoJO702ye*&k^/J_:CST<vl45e>pTJk(NKid:_7$\13u/cπU"VN0(;gYb:LOh=Dp,?[+[w*sM,k%o3O/Ha*(w0-ggi5%#QAM9;S/1mO)zqEsa%1JπU"vBFg'1FSXQ5o*Y)tRy+$ieq,Pq?gvn_j(OYp.n:/+nmgh*W<gOw/x'g<2^u.hYJπU"qkZ9ke*y?L:d\FQq.UFAr4)bilI21$4oq:,zZAW5H>QVnfbs8CYUt8<JozFINRTπU"r8]9n;%K->.>GI?QSaP#_[gtP6mB%\:P_q)Y>l1_e2Z;ur_?pQ.Q=APCb*ImLepπU"4AC=8gWlJC,mI/mm.TomxRZEvA%&^j.%r5zbX)[<Bh/:8=D7wHO)uTTQ2EmG\RXπU"'0Ch'pA^0bh+L?LOjq6#%-%pFo*cd%b?_&-QMQ8*WWrOf<?9ClZmGZJz2haOEf0πU"RrL2XIb]GhmN[7)znSMV9F,QHU+0\'U)VJlR6iUX'O0d0/Hn8CF3Q8B;_N#g4KQπU"*KZoJU3?LmxDO:\j>6iTxPi8/mL=^tuG\&?G;*U#[]-aJm(N^kDt4*k\Ya2IZvSπU"Q/EKh>R9YWkfa\1<C<]i]x<J'9m=;s<ppWRW7Jryt5Cs,._$:B*&a'a^*xLsq=5πU"9C+G#a*'<I-6cU=q5o88F='X:?Q5dV4Kh71aLZ)/m9fHur9IAOwVA<s*F3N*6vcπU"XlW6D/WIJ?rcn\G>odB-F0P[u>xSVQvT6>?-usn6xt&mWBJIDfHDGVfD,-p>IddπU"ciZD>/W7]ZDj9pLAl>x2fhyn_n:+p.I_hxa\l]\oCkELxY=>0/1Ok=<sRDJuY%YπU"WtI$^Yz3\l4:V79x#RoG#;l'YW/Ne'].8f^P\GlR^H4$;yYSq)$U],M;QC/L\IWπU"VdC0'qt5hbEVa_&mJ;(fU:^XQ_C<uApj_&bPf6p\0+_zWmkLTU]=2^46BqC1a=eπU"k0WR;,X,[OBN=[Iaa,x3xF/r&i*9)DmT2J[L=[TE[3^+.VAA1#Fl4r86lo;m9JIπU"wo&-K1uTZT]S\=Q&8gvO6HqAZ(eL1bVi-J'R9aaYG9GDZPOZGqPa0oeQ;1^U6yiπU"'.wYiofr%z]*9K\rs-#3#)'&8BR-_VE]IGX<I[lY)E0ak'5bBEHNlkr5[sL/MH,πU"ZoFCNYH:.sS8H?7c-IZ7(PZchs?jH6SVco$p[TVJ)VNSaAXL/WA64Yc\eP)AkbuπU"k],VCijnNw,fxi^QW+tLR6B=)5r)sMMSUN5F8MeUShyCzO.lXYsP%WxfrFzoOScπU"\5KFa=?CZL)lKxO+%a9PnWX*Mu(b\s9>0AfNwXW,'49V\.Cu;h:lh?^e.FF$E2UπU"A\.y9xeUZqa&Xo9d&QW:a*1B2=cN<0[UFg2cazN]/o1^d;G)jOvU8c==./W&cn7πU"hpy9(;&'v;()^iz_(3_\x1=1J4SCl,CG6&=;B7ZJ&S;==T)<145_2\';F6xOwf)πU"pwvYDiFZ*$VF$3gK7hZ[xwZG>ohETOabrrJJ1(LdD*vuhb\dnRhdR(+]%yj=s&IπU"UV+KZ1r_-fDOyyK??:WQtyhS49OhG>>k8AK<A/s3noma?\/3.'V1$*((?X1tT4]πU"6HCqn_)3c-X#?HO;_p%'ee&Qaz[eRhFFmBAN,1sr5fsk2DsQF)yOj^<lR3DyL#/πU"y3;i11qs6Ce=,q5wM+'GD=yX#&nBDZ3#F=0()5.fqUnjj)fNYArvQakw9r,Zp/sπU"W$:drqrMOM0ha:n;H>cz%=bl7_;=l,CfW.;h^(W;5s.jHdU?zp;LUGdeO$tK;fmπU"wj8Vi4tz[R,wscJvb5uh#$p6vqQ^YTo75sThtjWNLvMD<MYN0SW^2?1&AG,TS4'πU"kQu\,rD2%FB#+WRmB5+C8.P1dFO4:b9,AmBGITi_4R$ol6GqR1Ko9sy51N(/an+πU"jN7z0?-)A(h4SVz1cg.5p\KDm2wNirs&u#Jpx*r[n\-<9o/,/V=)/,f]e.JICl%πU"WXV%gdhE]/B^3GB(]CXXWWS_t^NTkX9,kzHYFh/EC>gUqN.Ngi69T\sdLEiT+vMπU"IjgYiS)4SH+j;C;f3aM1*?lQ=g;fh6_#DU:npF6OeK(12j/Ud+JBn$TrVx-8P.oπU"2#ZH[mXj&xq#4Hpn#z*U?EdufU*BlOG(J?E89%MF'*M'Hc-g*Vz]WDXCWZ5>[cLπU"%cTGwovC22>%e*$6^WIgbDQO,R1;JG9T*p_t#Hf0HZcC.5'tS7&JTTAZuN=[]5?πU"0K:BI,Yn^8Ku&_=Oz*3VhMEB7/fAcUzs$wLE8XMRm.3*RYRRAi2mMppUI%Akb5]πU"(7u:sOCAn&^e5B2pffkmjp$O;p\-+=u>KPTY'f)Tfk0H<W;p6\JX[_&KCt5r;FYπU"E6_^v7F)<75ns'p(.UJ4/u=F-ZJa>o\OP-4Jov4vp<FNiiSqn#q6i3lUi0O5U]3πU"#,%p?veIcqi:1[#1aX*]JnM^43KoVy1Oz7OcfV^#G4(e:ZV,5pIwCd39#iIAnU-πU"A;Pc#g_3;m7)BA,MTqabcap/XiI\<8Q&55V8'JCyd>pB3,cGI-km[t?NkT8;qdGπU"bCNb^Um]\k(Jn8:^>NIPP)I<sx)YlL(/&Pr2Y_nJ&(bdDND3[j#s+?12v.s;-DSπU"YjJFJnKc>Ljim4L^_qy6]/0zC,?_?m+1]2'fUMuQR:Q_]e-yElsRVsqD>#g/%)SπU"Ca9lB$Go*hm%%AIR^[ex:#9Gs'I(PDY4tLS8E';EATda0VWsgTQDvmE78tj[B0fπU"iZ/b+&dZbq/CPHOT+o[6eeBcYs-o26L=k9Bj0dd*p?O)vWQbii:81Ym34BMB:QKπU"%;0Up+X:H7\^N5E)?YkWmnU$C:#4d)Z=O0N)+.B('9E=z.\J9U9>C$4>2']ueqIπU"'D6LN6:drx.MA<+b%S6Dc6h6d67*o:=0DesUF0L*X2+zM9il.FsP>wnaf/:l,b+πU"2nMAaLS-'8r(]r2[)Tu<G5ejUcvYjF'-?zfuy0NPRP>9p5m&um1DW5>y*[vFS:wπU"E\,Nk2u#QJ;HAX*;%JgI/%XtkBOQs3+%6SNgF?r&g*6tyB4<1q?L#($B-_A>tk0πU"Z(ik1(5x^D#-gldHDkW%O-RZlUA<(lYUOnANWG&uG:E=3>P=<2]lbDbb(FOPFSrπU",Scu&$:jpd(#pe$/=pL,L5G$0:Oj['tzga]ol=MYs:1-j<j1WG\5f7[kS-39CJqπU"N;)WG2ASU^)>\eXp56jq7Six:VF;OqGa&4Bi.398R8Qae.16GQ1#-OksfSz'&CfπU"0PMR7iqdeh#LHmBG?9PK*Lu+1:8(*jFm=R./c-:dK\3QZtM$A-YVyA3R4W>ui4RπU"+8?Ae44+j\HJvm*/<oT'1SqhpD(>e8C&p9&d.8_bM:M1UoibLH.tPV>EA(n0c<BπU"oPP.c';7[:1%'E5^501d,xg0ARP6?n4nkOD9$W?kJV,\PX[j?xta:0i'&1\5[R#πU"sah4uLtWsd.Q63UfWGeXs;K7hNCz_,2*-6(]-7V/t<.*?,400O'VK*BJQ4Q]%D-πU"Uz(%i6zqo&]GQ*c$dgQJtn37fj10X)<MS+wH$=q4r&7_jD,-KVH;gynhf3Mv$R8πU"lE?5HpG'*ez\,)QGJni5\7.U&Dx];\1M/8V2'Yb0/J%W[1-d=AyKlJD*)x$G\ryπU"LI4L$B%E4;4cAN/eQK&X,n<pC[U(;GTNNp\C*SeAILh0]^Y#2=9\;wn03(YMH;4πU"SudITbKPN96*uAqv2IP+0_\6>P9q];+X&o/&9S&9KFH*)tt*ai>mWsL(g[P'9Z_πU"4#V/]9R2][M\4eyM?*I%,z+N';WIBEm2&H]k<Bh]#vo0O_kObAieCn/3glASj-IπU"g+\hUA,XZ(2[X-d]j+V><9EIOQl8<pa)>=?CGoJa6\E4J*r5.+#ZUhJDm?)9A?nπU"(+Y*TC._B>dt0v[NluvfTBzVcIB'W')Oz-;2*6'jh?48IuOm1SW/Tae%V2HR4(>πU"yUyM)%kI?a0s-tpJ'cxFS-<)S-7*g]FiRlP(^['ug%hC/>(uOviHmYGN]jq6Er[πU"wEf7vn&omzWh+TDqBpSq]uVDE#4C_jfOM0<8(q#fD'i##2A:*TVKC?dNp.U39e)πU"&3kF''c9tHox)?Kl5?V.]n;\1KZ-P2NM?2q4COYl_FQ>^8$'E+7z1+FXL7'=T%7πU")D=0xZCn2KF3^q:]D&cYV[MC]P(6&xmA%usV_aJFH+*[CIbm+QmfQ;Q-&AA7:4DπU"6;$\r?u_<YIn5H7QXrTLV.YV2k(kXC_A:8n8S5eb_]k$:Gt4iQ>9/TD&+%rD9e+πU"y,I7Rx<SvWibLG[rn90T]s3l=RsLY\)+4=ONTjJLoqMKE7m_U3iNVtNQP1L^TdXπU")?6+o%Rl;T.rs>)l.;cBK6,PXS<s:]e9fOn*uuNgE6%*jw9ao%odQh+L]J.kGgoπU"WxM'VYjNw4VcRqNt:4O_^iAPsq&3+'j[4g+Lbhs9Sll:O^>9U1_OXr7o.fY'c:VπU"1Vue?rnZZ7mqij/Vv<)^;RW.)3&NppJ]Y/t?0R_(mxWY#PRsBBLKPVKcgeb4bJ-πU"KjBRFJm7=*K$jx1w4mb+Dm:=6s\>;X&owK:a,XP+U)&.5v[jZTDNMQepb?UUTY.πU"r[yZHS2?,Ymlp<:3U*M6sr+?'X\t-]L%lw(:CB(,'l%KOnq)Tgk/PooGAr%$2dQπU"vR9[A#bQSpz/ulCN+PLg0&mIW]i/tDYSAMc+[OrXLMeiUMHxr^\kwGY)X9>A(1hπU"l1W7.XeOBYT5Sbml%L+7bJPdO5ehWv#2MTmle8]+Tv4&w/RU'RNiJF>t]l=QT8AπU"?z-8;J7/e9SLK^O^bj>3#9)l:929_#kwBL1OwZjI>zf?g^:sroNpWJ)I+/m+oK2πU"B2Be,#JgT%d\\iq3:E7(8Km(b&5_<UaANm&AafY76>Cs+FKO17r/?hr=s9aOC'GπU"fSyj--LZU>=<t)b1V#u3g$7l%Ij(K#GaD/'iDZ,A'HgOe1\a[a%R4=iG=Mes.,ZπU"U=4Fe*1]A%Pn$&(1tpumS:&FGV;S#VP1asocv^4YWe6dA#apXhg2W'w'i4X%Sr?πU"g*cS)>MN3OnxVeW\cuFxofDU8B1M\K+)D'H0.tUcQj)/c)VEK(YzO>DuZ1L\o%7πU"L1U#%tVY'EC$qz&,TDMa*D8a0_hF_Fw]#7';]bosaMXisLv)vGr-^gZJm#.[r.(πU"X%vpdAf4f5WAB.PG2urL)ZV'JWjeu[VIs*+kwBi8jIt%;+S=3df'pIO&B[tjdtDπU"INY-umoKJ_m)_&&Ue$9.HI*-=EK0u&oFuRa](G#zZJD3[p(E?cBW[pBV-%sCQgGπU"E#r*Pyl$XLf1Y.'^%%CU;f6u/)oUX'GEhq*,V<.C%.1RNv%%OsV1YS34rthc2*kπU"h-Ts5tc[/(Vnc5M>A9dL:lG6H'MI1Sf^05^%rC0-s'NRr&tyx0R%;1E+C.S&u3EπU"2Kb\9?dS3k,^1)O[4=G]5n]GhnC_A('9E:3-AsZHm\;5p__dS%&c/Acioowr'$,πU"j^DxfSB=3QJQ4Q$X7K(XV_K/EPF[-fc46NJ4uXinRf(VEa2lub$^n:0BhQ0k9tRπU"$u0H.S=\E%7rV)7_bde7gigTZRUD_1kYGV*tn?D/JY:ev=)S\7tb6vfx4A+ozZ\πU"=lE#]=7aDOyWwBW2M$K)SXEQ#(zdOi3a6OH.2K+Zo+O%S$3a(fR&EO9xns4>pdgπU"AGJ5?TSbFm/pWZEaG4q5CgmO;gCGE)9t'e2KlY5b8k17_NN(S4bQOZsNi1l7^&gπU"dMCK-v%k3U$=iBlrn-=YKI2a#1Q=#OQDSp./h>c.:Q\1nXq;l;%q0fcZBdZ6O#-πU"MCCV/RR)9)B<I06sT$VX5*4-G2KCYY?bhjDGh$ZA\tD7Tu.18bl#E#).ET)SxbKπU"5]g7,7_T-H+l]IeMPSCEWNDDmlFy6Ym#Vu9H/cAY^Z/A=WGh4lVuv2j#,mwK,QpπU"$i_68LmINv\CP.c4W_KwFf>+LLEc/^<cF*dw]oE4&I_(20St3#)hJ)Cq_1'+LM;πEND SUBπSUB V3πU"hUk6X39822g^*t5\SO:XjhHQsV>E3HSaKrb/5pW#72z(CcQRr0QX;Tg<(DuRUn\πU"OKU/Z1MjiQi7r1s7]1RkwS\ld=3VURV8\x;iL:0l/DlS)Z'Matov445;EZkZ2/#πU"Vh?B[Mp$qapT4fI_9AA5XHi'oBYemQ9WE:dBEI9mY*mY]D9#XNiC_+ql04JTdrIπU"5u.SF(nls0X9ZO1\(qcyda?k9W7E4'%liUJw+_\#Ecg4aHr,&)90L]rTH(7?(n<πU"Daoi#y#w2>1>>Wbq,LHfFW-c]c1w'\W+>N/o=i79n5q]w0+SOJf.3//7s?:'8ZWπU"Uw:d.mgZ#/pXgmZ\,,5=aiHNYJ1Q'I5p3<V9RE>p_,7hK>.=r\b1TFw46<E*#-jπU"NRdlJ,?&e)Yi%rpUltT4am&UN:d;P2?LC(iNGm:^6P9Yu$>'fvYKJk+wYV\#WwRπU"Q9#yO6PvANvLR+d&C2/dEx&dfeVM=e#b6,Y3w[dMmiH58I6AT?'\b\>Dx2Vr_t9πU":1g7/lI1nu+_4zz?PnsH?N(=Py)B>8SuX0p6aeU'i#499Q2M+,Uco\/*7DH]CdzπU"dzD10IkD.*p->1\I.?W6=4.=f-I]M-Mrp:exeWl:Rr$h$nwKC>[$R2-zq-R+c9ZπU"jDm[a[p;>;>.br4rkK(J4ZHF[s_Hx2qLuGxb?X<qiif=(uPsKfnFOieAf)>O0q+πU"g*8\b]]c%4i,ak1MemEH?9%)Qh[fJFuE+n0i./zZy-N.WZ'qg:rKj%q.3&9(jCVπU"%6Tdf8c3C$%k&D>%o%NO9\3(te_3'h=.[EMRs>J5)cCvXa6i*&BGA+a6Fv/+C*KπU"EhN]hqPL3M(+:=4)B[,D'q&nnm;*\$.=?bXYgntp::jvli=Zn/(A\A$VTjL2*RuπU".0f)FL-l&0H5IAitcSDOhPP0-xoZL33,9^S2M'kVrRHSSCrP)a]-2tb]Am5ZB\LπU"4Fmg1T7kx9bztf8bQ>;jjgx#]Jq7g-Jw\dsguWXq^1q(>_k*5BNQT?2s7pPa48)πU"B7#^L_+HGKvo22NGet^Wnp(o>zhsP\e)*?i)qn^s;7cN7>nC$]jrCpUyGiD_:G4πU"UbP?JQk;]pIDG[m,y,wRB3noAvGseTT3I:+jN[9;&UpVBH%rOYW$.mY5HHi)$7*πU"7sr3U8_OqhedXAnA?4,Xxr*/2<82EOg%RMH(BNA6;P&;TY#6]uhiNTn9,S:ZpCJπU"OT^m2-D;I.GV,.z=R*Rw)^m_1a1G*&=5\lTGk?=NU3EJ/'Gr(VzcH1KQl1JnG%;πU"IcWy=;uxi,l\kW9Czg&O*,$7h_4G>BM'L3*SD>QyhzOXq-e+k;NdfYASXm]EgK2πU"URTp0Sa*n9K0%Z'/D3+EGZecdMYaVU9=NeQm34KAx2p:f]B3l9hqYb[>A=3F\N.πU"8Ep>hk<5)Ok5q_qsJG)AxV)7)[W%3:xKcVbm*USbCA9<Zd2wLHTPY*hvILmi<bnπU"pF6gCAuj#GFXDE-*PAnV_I<%498c8u*YwvV+VR0fpQL\^JM'c#^gQ+IHH#eduebπU"tRW)/wSdWwygUoYsp??<gftq6rjidL=-nJ)zyykA&q4DDa;P5_h+2Z96v(PI<[IπU"?qBTcpHOG'Cq^M%eC4^vUaf$0t6OUh,RY1:91Vs)QO3C3n>Mf&&X*SqlnRJ'pGXπU"I)iZTPw=f\4_Nlgl1UXJhwLztcQ,r=sKfKn3Zc5X3sufB(+r%&+%U:D'=T,y8wGπU"55]xL)\iRu:15FR]&B(Q;ij(k%]0DlJv/QpO>SCC[^pL$WmRmM[FsojVeR^Y<4bπU">U.g#s\Gvh9gXheg+f691ecN8rKna$*2('MTiH]]C?1Ev+)Nxf33ii0\N-yA^K#πU"$TTq9DFssgf#K\--w;R\BioGQX&O5jYgwEA%sF/9,o6/GBcvU:;.n3mb2Lu7i]%πU"C$&HY?Wg9aK$ovO*gjzVffCOd+/#n&=l(=VC&p'f,IT>8'[<t>ManqxI+lTq^fEπU"D_iB1pP8-ACNsym4Re.&*h\GQZ.KA=L[tgm\t-<xL.#uN0_&F^Ah(<Ow;]EMCR1πU"WD;^e(Q5Ji)eW'DAb0:^2.s\oGWJ#8/=BbE2_hTP5ijzs=FLS3/\6Su%E>TRd[:πU"-kS&WDrG:nZP2n)xoatcU'^yYl(_u//'kW,P(y3u&DDb)=tm+c=YvtQWuu-1b7QπU"QAW5I[w^mX=N5NsC)1o(T]LhB$K(KHq'ao]Mux%%up&%'9%9%%%%-g%3n]RAY(0πU"+]N2%+%[H%%%/%%%%%%%%%&%E%%%%%%%%%w%jfir#jSy'%yup&%'9%9%%%%-j%&πU"m]jA1H.*Q:l%7%Zl%%%0%%%%%%%%%&%E[%%%v%2%%r%fuun%slSg%fxup%*+%%%πU"%%'%.'%#%.%%$z%%%%%πEND SUBπV2πV3πCLOSE:IF S=249AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπRobin Ohm PICTURE PUZZLE rkohm@euronet.nl 09-28-96 (16:05) QB, QBasic, PDS 280 8341 PUZZLE.BAS REM **********************************************πREM More Qbasic Software:πREM http://www.euronet.nl/users/rkohm/πREM Any questions? E-mail to:πREM rkohm@euronet.nlπREM **********************************************ππDECLARE SUB swapbox (which!)πDECLARE SUB check ()πDECLARE SUB game ()πDECLARE SUB move (whereto!)πDECLARE SUB fieldsetup ()πDECLARE SUB background ()ππCOMMON SHARED x, y, xcoor, ycoor, xold, yold, loca, sound$ππCLS : SCREEN 12πxcoor = 363: ycoor = 163: loca = 1ππON KEY(10) GOSUB endofgameπKEY(10) ONππDIM SHARED square1(200), square2(200), square3(200), square4(200)πDIM SHARED square5(200), square6(200), square7(200), square8(200)πDIM SHARED square9(200), square10(200), square11(200), square12(200)πDIM SHARED square13(200), square14(200), square15(200), square16(200)πDIM SHARED box(16), theone(200)ππRANDOMIZE TIMERπFOR temp = 1 TO 16πagain:π DO: place = FIX(RND * 16 + 1): LOOP UNTIL 1 <= place <= 16π IF box(place) <> 0 THEN GOTO againπ box(place) = tempπNEXTππ'FOR sed = 1 TO 16π' box(sed) = sedπ'NEXTπ'box(5) = 1: box(1) = 5ππbackgroundπfieldsetupππDOπ gameπ checkπLOOPπππENDππendofgame:πENDππSUB backgroundπLOCATE 10, 23: PRINT "Select a background for the puzzle: (1-3)"πLOCATE 11, 28: PRINT "1. House"πLOCATE 12, 28: PRINT "2. Boat"πLOCATE 13, 28: PRINT "3. Car"πDO: user$ = INKEY$: LOOP UNTIL user$ = "1" OR user$ = "2" OR user$ = "3"πCLSπDRAW "bm280,330u176l176d176r176bh8u160l160d160r160bfp15,15h" 'square 1ππSELECT CASE user$πCASE "1"π DRAW "bl45bu10p9,15c14u70l100d70r100bhp14,14fu70c4h50g50r100h4blp4,4rh10c6u40l20d20"π DRAW "f20u4blp6,6rbg70bd16c1u40r30d40l30bep1,1gbe20br25c2u30r30d30l30bep2,2g"π DRAW "br83l43d23l102u23l13d31r158u31bgp2,2"π CIRCLE (245, 200), 20, 14: PAINT (245, 200), 14, 14 'houseπCASE "2"π DRAW "bhp9,15c1u30l160d30r160bhp1,1f2"π DRAW "bl55c14be15e35l150f35r80bhp14,14fl15u36c6u90l10d90r10bhp6,6fu10c8r50"π LINE STEP(0, 0)-(218, 190), 8: DRAW "d70bep8,8": LINE (206, 190)-(120, 262), 8π DRAW "r86u70d5blp8,8ru5bd100br15": CIRCLE STEP(0, 0), 5, 2: DRAW "p2,2bl30"π CIRCLE STEP(0, 0), 5, 2: DRAW "p2,2bl30": CIRCLE STEP(0, 0), 5, 2: DRAW "p2,2"π CIRCLE (250, 190), 15, 14: PAINT STEP(0, 0), 14, 14 'boatπCASE "3"π DRAW "bhp9,15c2u35l160d35r160bhp2,2": CIRCLE (160, 280), 18, 8: DRAW "p8,8"π CIRCLE (225, 280), 18, 8: DRAW "p8,8": CIRCLE (160, 280), 8, 7: DRAW "p7,7"π CIRCLE (225, 280), 8, 7: DRAW "p7,7"π DRAW "bm267,320c12bh40r35u30l30h20l40g20l30d30r140bh30bl5"π DRAW "p12,12c8h15l20d15r35l2bup8,8dbl38u15l10g15r25bhp8,8fc0bu21br10h35bh"π CIRCLE STEP(0, 0), 2, 0: DRAW "p0,0": CIRCLE (230, 190), 15, 14: DRAW "p14,14"πEND SELECTππDRAW "bm112,162c15r160d160l160u160r40d160r40u160r40d160r40u40l160u40r160u40l160"ππDRAW "bm530,330u176l176d176r176bh8u160l160d160r160bfp15,15h" 'square 2πDRAW "bm362,162c15r160d160l160u160r40d160r40u160r40d160r40u40l160u40r160u40l160"πππDRAW "bm133,183p0,15"'bm1,1p4,15"πGET (113, 163)-(151, 201), square1πGET (153, 163)-(191, 201), square2πGET (193, 163)-(231, 201), square3πGET (233, 163)-(271, 201), square4πGET (113, 203)-(151, 241), square5πGET (153, 203)-(191, 241), square6πGET (193, 203)-(231, 241), square7πGET (233, 203)-(271, 241), square8πGET (113, 243)-(151, 281), square9πGET (153, 243)-(191, 281), square10πGET (193, 243)-(231, 281), square11πGET (233, 243)-(271, 281), square12πGET (113, 283)-(151, 321), square13πGET (153, 283)-(191, 321), square14πGET (193, 283)-(231, 321), square15πGET (233, 283)-(271, 321), square16ππLOCATE 2, 5: COLOR 14: PRINT "F10"; : COLOR 15: PRINT " Exit"πLOCATE 3, 5: COLOR 14: PRINT "(Arrow keys on the Number Pad)";πCOLOR 15: PRINT " Move Red Box"πLOCATE 4, 5: COLOR 14: PRINT "Enter"; : COLOR 15: PRINT " Move a piece to the empty place."ππLOCATE 23, 5: PRINT "Move the pieces until you have completed the puzzle. You can only move"πLOCATE 24, 5: PRINT "pieces to the empty (black) place. "πEND SUBππSUB checkπFOR rgt = 1 TO 16π IF box(rgt) <> rgt THEN EXIT SUBπNEXTπCOLOR 14: LOCATE 26, 5: PRINT "Congratulations!! You have completed the puzzle!!"πCOLOR 4: ENDπEND SUBππSUB fieldsetupπFOR temp = 1 TO 16πmove tempπSELECT CASE box(temp)π CASE 1: PUT (x, y), square1, PSETπ CASE 2: PUT (x, y), square2, PSETπ CASE 3: PUT (x, y), square3, PSETπ CASE 4: PUT (x, y), square4, PSETπ CASE 5: PUT (x, y), square5, PSETπ CASE 6: PUT (x, y), square6, PSETπ CASE 7: PUT (x, y), square7, PSETπ CASE 8: PUT (x, y), square8, PSETπ CASE 9: PUT (x, y), square9, PSETπ CASE 10: PUT (x, y), square10, PSETπ CASE 11: PUT (x, y), square11, PSETπ CASE 12: PUT (x, y), square12, PSETπ CASE 13: PUT (x, y), square13, PSETπ CASE 14: PUT (x, y), square14, PSETπ CASE 15: PUT (x, y), square15, PSETπ CASE 16: PUT (x, y), square16, PSETπEND SELECTπNEXTπEND SUBππSUB gameπxold = xcoor: yold = ycoorπLINE (xcoor - 1, ycoor - 1)-(xcoor + 39, ycoor + 39), 4, BπDO: userinput$ = INKEY$: LOOP UNTIL userinput$ <> ""πSELECT CASE userinput$πCASE "8"π IF ycoor > 163 THENπ ycoor = ycoor - 40π loca = loca - 4π sound$ = "no"π END IFπCASE "6"π IF xcoor < 483 THENπ xcoor = xcoor + 40π loca = loca + 1π sound$ = "no"π END IFπCASE "2"π IF ycoor < 283 THENπ ycoor = ycoor + 40π loca = loca + 4π sound$ = "no"π END IFπCASE "4"π IF xcoor > 363 THENπ xcoor = xcoor - 40π loca = loca - 1π sound$ = "no"π END IFπCASE CHR$(13)π SELECT CASE locaπ CASE 1π IF box(loca + 1) = 1 THEN swapbox 1π IF box(loca + 4) = 1 THEN swapbox 4π CASE 2, 3π IF box(loca - 1) = 1 THEN swapbox -1π IF box(loca + 1) = 1 THEN swapbox 1π IF box(loca + 4) = 1 THEN swapbox 4π CASE 4π IF box(loca - 1) = 1 THEN swapbox -1π IF box(loca + 4) = 1 THEN swapbox 4π CASE 5, 9π IF box(loca + 1) = 1 THEN swapbox 1π IF box(loca - 4) = 1 THEN swapbox -4π IF box(loca + 4) = 1 THEN swapbox 4π CASE 6, 7, 10, 11π IF box(loca - 1) = 1 THEN swapbox -1π IF box(loca + 1) = 1 THEN swapbox 1π IF box(loca - 4) = 1 THEN swapbox -4π IF box(loca + 4) = 1 THEN swapbox 4π CASE 8, 12π IF box(loca - 1) = 1 THEN swapbox -1π IF box(loca - 4) = 1 THEN swapbox -4π IF box(loca + 4) = 1 THEN swapbox 4π CASE 13π IF box(loca + 1) = 1 THEN swapbox 1π IF box(loca - 4) = 1 THEN swapbox -4π CASE 14, 15π IF box(loca - 1) = 1 THEN swapbox -1π IF box(loca + 1) = 1 THEN swapbox 1π IF box(loca - 4) = 1 THEN swapbox -4π CASE 16π IF box(loca - 1) = 1 THEN swapbox -1π IF box(loca - 4) = 1 THEN swapbox -4π END SELECTπEND SELECTπIF sound$ = "" THEN PLAY "L30GC"πsound$ = ""πLINE (xold - 1, yold - 1)-(xold + 39, yold + 39), 15, BπLINE (xcoor - 1, ycoor - 1)-(xcoor + 39, ycoor + 39), 4, BπEND SUBππSUB move (whereto)πSELECT CASE wheretoπ CASE 1: x = 363: y = 163π CASE 2: x = 403: y = 163π CASE 3: x = 443: y = 163π CASE 4: x = 483: y = 163π CASE 5: x = 363: y = 203π CASE 6: x = 403: y = 203π CASE 7: x = 443: y = 203π CASE 8: x = 483: y = 203π CASE 9: x = 363: y = 243π CASE 10: x = 403: y = 243π CASE 11: x = 443: y = 243π CASE 12: x = 483: y = 243π CASE 13: x = 363: y = 283π CASE 14: x = 403: y = 283π CASE 15: x = 443: y = 283π CASE 16: x = 483: y = 283πEND SELECTπEND SUBππSUB swapbox (which)πsound$ = "no"πSELECT CASE whichπ CASE -1: box(loca - 1) = box(loca): box(loca) = 1π CASE 4: box(loca + 4) = box(loca): box(loca) = 1π CASE 1: box(loca + 1) = box(loca): box(loca) = 1π CASE -4: box(loca - 4) = box(loca): box(loca) = 1πEND SELECTππDOπIF times = 0 THEN variable = loca + whichπIF times = 1 THEN variable = locaππmove variableπSELECT CASE box(variable)π CASE 1: PUT (x, y), square1, PSETπ CASE 2: PUT (x, y), square2, PSETπ CASE 3: PUT (x, y), square3, PSETπ CASE 4: PUT (x, y), square4, PSETπ CASE 5: PUT (x, y), square5, PSETπ CASE 6: PUT (x, y), square6, PSETπ CASE 7: PUT (x, y), square7, PSETπ CASE 8: PUT (x, y), square8, PSETπ CASE 9: PUT (x, y), square9, PSETπ CASE 10: PUT (x, y), square10, PSETπ CASE 11: PUT (x, y), square11, PSETπ CASE 12: PUT (x, y), square12, PSETπ CASE 13: PUT (x, y), square13, PSETπ CASE 14: PUT (x, y), square14, PSETπ CASE 15: PUT (x, y), square15, PSETπ CASE 16: PUT (x, y), square16, PSETπEND SELECTπtimes = times + 1πLOOP UNTIL times = 2πtimes = 0πEND SUBπBrennen Bearnes QBASIC ROCKWARS bbearnes@worldnet.att.net 10-05-96 (15:14) QB, QBasic, PDS 473 13252 ROCKWARS.BAS'QBasic Rockwars, by Brennen Bearnesπ'You play the part of the blue castle. You've been attacked byπ'the red castle, who has started sending robotic tanks equipped withπ'a short range death ray at you. Fortunately, you've been hard at workπ'on your own secret weapon, a powerful catapult that can launch rocksπ'all the way to the other side of the screen.ππ'How to play:π'A tank will start coming at you as soon as the game begins. If theπ'red castle is fairly close, then you should shoot the tank first.π'Every time you blow up a tank, the red castle sends another one,π'so sooner or later, you'll have to hit the castle. To fire, pressπ'F1, and type in the angle (10-180) and velocity (0-100) you want. Beπ'sure to take the wind into account. If the tank gets close enough,π'then you're toast.ππ'Brent P. Newhall did all the code for the explosions, as well as the starπ'field, and a number of other small but effective changes.π'The little moon orbiting a planet in the background was doneπ'by Marco Koegler (and thanks to everyone else that told me how to do it).π'I figured out how to plot the projectiles from GORILLA.BAS, which Iπ'found on an old computer at school.ππ'Suggestions are welcome, and if you improve this in any way, pleaseπ'send me a copy.π'bbearnes@worldnet.att.netπ'http://www.geocities.com/SiliconValley/Park/8994/ππ' Brent P. Newhall edited 9/30/96π' Notes: The explode code now restores the screen to how it looked priorπ' to the explosion. I then added code to erase the bullet andπ' exploded item just after the explosion. I also added the stars.π' Before, you could enter an angle of zero and just wipe outπ' anything before you. Now the angle can be no less than 10.π' I've also cleaned up the code a bit, making it more readable,π' less time- and memory-intensive, etc.ππDECLARE SUB newTank ()πDECLARE SUB drawTank ()πDECLARE SUB newRock ()πDECLARE SUB drawRock ()πDECLARE SUB explode (green%, blue%, red%, boomX, boomY, boomSize)ππCONST pi = 3.141592654#ππTYPE arctypeπ Radius AS INTEGERπ colr AS INTEGERπ p1 AS SINGLEπ p2 AS SINGLEπEND TYPEππ'Variables that control the rockπDIM SHARED rockAngleπDIM SHARED rockSpeedπDIM SHARED startRockXπDIM SHARED startRockYπDIM SHARED oldRockXπDIM SHARED oldRockYπDIM SHARED rock1existπDIM SHARED t 'timeπDIM SHARED rockXπDIM SHARED rockYπDIM SHARED startRockXvelπDIM SHARED startRockYvelπDIM SHARED gravityπDIM SHARED windππ'The castles and tank.πDIM SHARED castle2XπDIM SHARED castleXπDIM SHARED tankExistπDIM SHARED TankXπDIM SHARED oldTankXπDIM SHARED tankSpeedπDIM SHARED castleExistπDIM SHARED castle2ExistππDIM SHARED x1 AS INTEGER, y1 AS INTEGER, x2 AS INTEGER, y2 AS INTEGERπDIM SHARED ExplodeHold(1 TO 10000) AS INTEGERππcastleExist = 1πcastle2Exist = 1ππSCREEN 13π π'GET the player's castle.πDIM SHARED castle%(15, 15)πLINE (5, 5)-(20, 20), 1, BFπLINE (8, 5)-(10, 7), 0, BFπLINE (12, 5)-(14, 7), 0, BFπLINE (16, 5)-(18, 7), 0, BFπLINE (10, 15)-(15, 20), 0, BFπGET (5, 5)-(20, 20), castle%πCLSππ'GET the computer's castle.πDIM SHARED castle2%(15, 15)πLINE (5, 5)-(20, 20), 4, BFπLINE (8, 5)-(10, 7), 0, BFπLINE (12, 5)-(14, 7), 0, BFπLINE (16, 5)-(18, 7), 0, BFπLINE (10, 15)-(15, 20), 0, BFπGET (5, 5)-(20, 20), castle2%πCLSππ'GET the tankπDIM SHARED tank%(11, 8)πLINE (2, 4)-(10, 6), 2, BFπLINE (5, 1)-(8, 4), 2, BFπLINE (1, 2)-(5, 2), 2πCIRCLE (3, 6), 2, 2πCIRCLE (8, 6), 2, 2πGET (1, 1)-(11, 8), tank%πCLSππ'The tank firing.πDIM SHARED tank2%(11, 8)πLINE (2, 4)-(10, 6), 2, BFπLINE (5, 1)-(8, 4), 2, BFπLINE (1, 1)-(5, 3), 2πCIRCLE (3, 6), 2, 2πCIRCLE (8, 6), 2, 2πGET (1, 1)-(11, 8), tank2%πCLSππ'The center of the planetπplanetX = 180: planetY = 45π'Draw the planetπFOR circ% = 1 TO 8π CIRCLE (planetX, planetY), circ%, 9π CIRCLE (planetX, planetY + 1), circ%, 9πNEXT circ%πLINE (planetX - 8, planetY)-(planetX + 8, planetY), 4πLINE (planetX - 8, planetY - 2)-(planetX + 8, planetY - 2), 12πLINE (planetX - 7, planetY - 3)-(planetX + 7, planetY - 3), 12πLINE (planetX - 5, planetY - 5)-(planetX + 5, planetY - 5), 4πLINE (planetX - 8, planetY + 3)-(planetX + 8, planetY + 3), 4πLINE (planetX - 6, planetY + 5)-(planetX + 6, planetY + 5), 4πCIRCLE (planetX + 2, planetY + 4), 2, 4πCIRCLE (planetX + 2, planetY + 4), 1, 4πCIRCLE (planetX + 3, planetY + 4), 1, 4ππ'Draw the groundπLINE (0, 175)-(320, 175), 10πPAINT (0, 176), 10, 1ππ'PUT the castlesπcastleX = 15πPUT (castleX, 159), castle%πRANDOMIZE TIMERπcastle2X = INT(RND * 175) + 175πIF castle2X >= 285 THEN castle2X = 285πPUT (castle2X, 159), castle2%ππ'The code to make the moon "orbit" the planet was done by Marco KoeglerπorbitRadius = 30 'Radius of the orbitπmoonAngle = 0 'Initialize the moons angleπoldMoonX = planetX + 75: oldMoonY = planetYππgravity = 9.8ππ'Display starsπFOR cnt% = 1 TO 75π PSET (INT(RND * 319), INT(RND * 120) + 30), INT(RND * 15 + 15)πNEXT cnt%ππDOπ moonAngle = moonAngle + .5π IF moonAngle = 360 THEN moonAngle = 0π theta = moonAngle * (pi / 180)π moonX = planetX + orbitRadius * (COS(theta))π moonY = planetY - orbitRadius * (SIN(theta))π π 'Erase old moonπ CIRCLE (oldMoonX, oldMoonY), 2, 0π π 'Draw new moonπ CIRCLE (moonX, moonY), 2, 8π oldMoonX = moonX: oldMoonY = moonYππ ptime! = TIMER: WHILE ptime! = TIMER: WEND ' Pauseππ K$ = INKEY$π IF LEN(K$) = 2 THENπ SELECT CASE ASC(RIGHT$(K$, 1))π CASE 59 'F1π IF rock1exist = 0 THENπ newRockπ END IFπ END SELECTπ ELSEIF LEN(K$) = 1 THENπ SELECT CASE ASC(K$)π CASE 27: quit = 1π END SELECTπ END IFπ π IF rock1exist = 1 THENπ drawRockπ END IFππ IF tankExist = 0 AND castle2Exist = 1 THENπ newTankπ ELSEIF tankExist = 1 THENπ drawTankπ END IFππ IF castleExist = 0 THENπ '"Melt" the screen and end the game if the player loses.π quit = 2π ELSEIF castle2Exist = 0 AND tankExist = 0 THENπ 'If the red castle and tank are both blown up, then end the game.π quit = 3π END IFππLOOP UNTIL quit > 0ππIF quit = 2 THENπ '"Melt" the screen and end the game if the player loses.π LOCATE 8, 15: PRINT "you lose"π LOCATE 9, 14: PRINT "the end"π SLEEP 1π DIM melt%(3000)π FOR RR = 1 TO 3000π RANDOMIZE TIMERπ XX = INT(RND * 271)π RANDOMIZE TIMERπ YX = INT(RND * 150)π GET (XX, YX)-(XX + 48, YX + 48), melt%π PUT (XX, YX + 1), melt%, PSETπ IF INKEY$ = CHR$(27) THEN ENDπ NEXT RRπELSEIF quit = 3 THENπ 'If the red castle and tank are both blown up, then end the game.π LOCATE 15, 15: PRINT "you win"πEND IFππENDππSUB drawRockππoldRockX = rockXπoldRockY = rockYππ'Calculate the next position of the rockπrockX = startRockX + (startRockXvel * t) + (.5 * (wind / 5) * t ^ 2)πrockY = startRockY + ((-1 * (startRockYvel * t)) + (.5 * gravity * t ^ 2)) * (200 / 350)ππIF rockY >= 174 THENπ 'Do an explosion when the rock hits the "ground".π rock1exist = 0π green% = 20π blue% = 0π boomX = rockXπ boomY = rockYπ boomSize = 6π explode green%, blue%, red%, boomX, boomY, boomSizeπ CIRCLE (oldRockX, oldRockY), 1, 0 ' Erase rockπELSEIF rockY >= 159 AND rockX >= castle2X AND rockX <= castle2X + 15 THENπ 'Do an explosion when the rock hits the enemy castle.π IF castle2Exist = 1 THENπ rock1exist = 0π castle2Exist = 0π green% = 0π blue% = 0π boomX = rockXπ boomY = rockYπ boomSize = 50π explode green%, blue%, red%, boomX, boomY, boomSizeπ CIRCLE (oldRockX, oldRockY), 1, 0 ' Erase rockπ PUT (castle2X, 159), castle2% ' Erase enemy castleπ END IFπELSEIF rockY >= 167 AND rockX >= TankX AND rockX <= TankX + 10 THENπ 'Do an explosion if rock hits the tank.π tankExist = 0π rock1exist = 0π green% = 20π blue% = 0π boomX = TankXπ boomY = rockYπ boomSize = 30π explode green%, blue%, red%, boomX, boomY, boomSizeπ CIRCLE (oldRockX, oldRockY), 1, 0 ' Erase rockπ PUT (INT(TankX), 167), tank%, XOR ' Erase tankπEND IFππIF rockX >= 319 OR rockX <= 1 THENπ rock1exist = 0π CIRCLE (oldRockX, oldRockY), 1, 0πEND IFππIF rock1exist = 1 THENπ CIRCLE (oldRockX, oldRockY), 1, 0π CIRCLE (rockX, rockY), 1, 12πELSEIF rock1exist = 0 THENπ rockX = 0π rockY = 0πEND IFππt = t + .1ππEND SUBππSUB drawTankππ'Move the tank, or if the tank is close enough, blow up the player'sπ'castle.πtankSpeed = .5πIF TankX > castleX + 60 THENπ 'Make the tank try to avoid the rocks (doesn't work very well, but canπ 'make the game a little more challenging).π IF TankX - rockX < 20 AND TankX - rockX > -1 THENπ tankSpeed = -.8π END IFπ oldTankX = TankXπ TankX = TankX - tankSpeedπELSEIF TankX <= castleX + 60 THENπ PUT (INT(TankX), 167), tank2%, PSETπ SLEEP 1π PALETTE 95, 60π LINE (INT(TankX) - 2, 167)-(castleX + 15, 162), 95π FOR cnt% = 1 TO 30π PALETTE 95, INT(RND * 30 + 30)π ptime! = TIMER: WHILE ptime! = TIMER: WEND ' Pauseπ NEXT cnt%π PALETTE 95, 0π tankExist = 0π green% = 0π blue% = 30π boomX = castleX + 15π boomY = 162π boomSize = 50π explode green%, blue%, red%, boomX, boomY, boomSizeπ castleExist = 0πEND IFππPUT (INT(oldTankX), 167), tank%, XORπPUT (INT(TankX), 167), tank%, PSETππEND SUBππSUB explode (green%, blue%, red%, boomX, boomY, boomSize)ππ'This code started as EXPLODE.BAS by Brent P. Newhall. I've only made aπ'few minor changes. The comments are all his.ππ''I was thinking about that "I need fire and an exploding graphic" postπ''and came up with this simple explosion program. Any suggestions,π''comments, etc. are welcome with open arms.ππ''NOTES: There are two lines that do not wrap properly; you'll be able toπ''find them easily. Also, NumArcs is set to 100, which does anπ''acceptable explosion on my 486DX2/50 with 8 megs of RAM. You Pentiumπ''people should be able to get a much nicer explosion if you set NumArcsπ''equal to 1000 or so.ππ''The program sets colors 100 to 131 to varying shades of red, orange,π''and yellow for the explosive effect, with the nice side-effect thatπ'you can theoretically do several explosions at once.ππNumArcs = 65πDIM arc(1 TO NumArcs) AS arctypeπRANDOMIZE TIMERπFOR cnt% = 1 TO NumArcs ' Initialiseπ arc(cnt%).Radius = 0π arc(cnt%).p1 = RND * 5.8π arc(cnt%).p2 = arc(cnt%).p1 + (RND / 2)π arc(cnt%).colr = INT(RND * 5 + 100)πNEXT cnt%πred% = 63 ' Start it deep redπFOR cnt% = 100 TO 130 ' Change colorsπ PALETTE cnt%, red% + 256 * green% + 65536 * blue%π IF cnt% <= 114 THEN ' Lower red, increase yellowπ red% = red% - 2π green% = green% + 2π ELSE ' Lower red and yellowπ red% = red% - 2π green% = green% - 2π END IFπNEXT cnt%πPALETTE 131, 0πTimeCnt% = 0πx1 = boomX - boomSizeπIF x1 < 0 THEN x1 = 0πy1 = boomY - boomSizeπIF y1 < 0 THEN y1 = 0πx2 = boomX + boomSizeπIF x2 > 319 THEN x2 = 319πy2 = boomY + boomSizeπIF y2 > 199 THEN y2 = 199πGET (x1, y1)-(x2, y2), ExplodeHold(1)πDOπ TimeCnt% = TimeCnt% + 1π FOR CurrArc% = 1 TO NumArcsπ IF arc(CurrArc%).Radius > 4 THEN ' Erase previous arcπ CIRCLE (boomX, boomY), arc(CurrArc%).Radius - 5, 0, arc(CurrArc%).p1, arc(CurrArc%).p2π END IFπ IF arc(CurrArc%).Radius = 0 THEN ' Not yet aliveπ ' About 30% of the time, create a new arcπ IF RND > .7 THEN arc(CurrArc%).Radius = 1π ELSEIF arc(CurrArc%).colr = 131 THEN ' Deadπ REM Do Nothingπ ELSEπ arc(CurrArc%).Radius = arc(CurrArc%).Radius + 1 ' Increase radiusπ arc(CurrArc%).colr = arc(CurrArc%).colr + 1 ' Increase colorπ ' Draw arcπ CIRCLE (boomX, boomY), arc(CurrArc%).Radius, arc(CurrArc%).colr, arc(CurrArc%).p1, arc(CurrArc%).p2π END IFπ NEXT CurrArc%π t! = TIMER: WHILE t! = TIMER: WEND ' Pauseπ IF TimeCnt% >= boomSize THEN quitExplode = 1πLOOP UNTIL quitExplode > 0πPUT (x1, y1), ExplodeHold(1), PSETππEND SUBππSUB newRockππ'initialize the wind, and tell the player.πRANDOMIZE TIMER: windirec = RND * 2:πLOCATE 1, 1: PRINT SPC(30);πIF windirec <= 1 THENπ RANDOMIZE TIMER: wind = RND * -10π LOCATE 1, 1: PRINT "wind: "; wind; "<-"πELSEIF windirec > 1 THENπ RANDOMIZE TIMER: wind = RND * 10π LOCATE 1, 1: PRINT "wind:"; wind; "-> "πEND IFπππ'Get player input for angle and velocity, and initialize the rock.π'Velocity can range from 0 to 100, and angle can be inbetween 10 and 180.ππLOCATE 2, 1: PRINT "Angle: "πDOπ LOCATE 2, 7: PRINT " ";π LOCATE 2, 7: INPUT "", rockAngleπLOOP UNTIL rockAngle >= 10 AND rockAngle <= 180πLOCATE 3, 1: PRINT "Velocity: "πDOπ LOCATE 3, 10: PRINT " ";π LOCATE 3, 10: INPUT "", rockSpeedπLOOP UNTIL rockSpeed >= 0 AND rockSpeed <= 100π πLINE (1, 1)-(50, 50), 0πstartRockX = castleX + 6πstartRockY = 157πoldRockX = startRockXπoldRockY = startRockYπrock1exist = 1ππrockAngle = rockAngle / 180 * piπstartRockXvel = COS(rockAngle) * rockSpeedπstartRockYvel = SIN(rockAngle) * rockSpeedππt = 0ππdrawRockππEND SUBππSUB newTankππ'Initialize tank.πtankExist = 1πTankX = castle2X - 12πoldTankX = castle2X - 12ππPUT (castle2X, 159), castle2%, PSETππdrawTankππEND SUBπBrian Flanagan STICK FIGHTER Brianster@aol.com 10-14-96 (09:09) QB, QBasic, PDS 492 21159 QBFIGHT.BAS ' This is a quick beta for a fighter-type ( i.e. mortal kombat ) QBasic game.π' I looked for a good fighter game written in QBasic, but most the ones thatπ' I found were pretty lame - mostly tiny graphics with very little feel forπ' player movement, which I think is what really makes these type of gamesπ' fun. Anyway, there is still plenty of work left to do here, but seeingπ' how several programmers jumped on Peter Cooper's raycasting engine, Iπ' figured that I might bounce it here and get some feed-back. Feel free toπ' do with this what you will, and I would appreciate any improvements to theπ' code sent to me.π'π' Brianster@aol.comπ' :-)π'π' BTW, some of these lines may wrap once posted to the newsgroup, so youπ' might have to edit the code a little bit before it runs...π'ππTYPE playerdataπ xpos AS INTEGERπ ypos AS INTEGERπ frame AS INTEGERπ mframe AS INTEGERπ tframe AS INTEGERπ strength AS INTEGERπEND TYPEππDIM player(2) AS playerdataππTYPE PointTypeπ xpos AS INTEGERπ ypos AS INTEGERπEND TYPEππTYPE splatdataπ xpos AS INTEGERπ ypos AS INTEGERπ frame AS INTEGERπEND TYPEππDIM splat AS splatdataππmaxmoves% = 9ππDIM rs(maxmoves%) AS PointTypeπDIM ls(maxmoves%) AS PointTypeπDIM re(maxmoves%) AS PointTypeπDIM le(maxmoves%) AS PointTypeπDIM rh(maxmoves%) AS PointTypeπDIM lh(maxmoves%) AS PointTypeπDIM rw(maxmoves%) AS PointTypeπDIM lw(maxmoves%) AS PointTypeπDIM rk(maxmoves%) AS PointTypeπDIM lk(maxmoves%) AS PointTypeπDIM ra(maxmoves%) AS PointTypeπDIM la(maxmoves%) AS PointTypeπDIM rt(maxmoves%) AS PointTypeπDIM lt(maxmoves%) AS PointTypeππFOR i% = 1 TO maxmoves%π READ rh(i%).xpos, rh(i%).ypos, lh(i%).xpos, lh(i%).yposπ READ re(i%).xpos, re(i%).ypos, le(i%).xpos, le(i%).yposπ READ rs(i%).xpos, rs(i%).ypos, ls(i%).xpos, ls(i%).yposπ READ rw(i%).xpos, rw(i%).ypos, lw(i%).xpos, lw(i%).yposπ READ rk(i%).xpos, rk(i%).ypos, lk(i%).xpos, lk(i%).yposπ READ ra(i%).xpos, ra(i%).ypos, la(i%).xpos, la(i%).yposπ READ rt(i%).xpos, rt(i%).ypos, lt(i%).xpos, lt(i%).yposπNEXT i%ππ' Standing still.π' Frame 1.πDATA 14,88,24,79πDATA 12,109,16,102πDATA 1,81,1,81πDATA 0,119,0,119πDATA 20,148,5,148πDATA 31,178,-7,175πDATA 39,180,-2,184ππ' Punch.π' Frame 2.πDATA 19,85,33,86πDATA 12,108,17,103πDATA 1,80,1,80πDATA 0,119,0,119πDATA 21,147,6,147πDATA 31,178,-14,175πDATA 40,181,-9,183ππ' Frame 3.πDATA 26,81,49,77πDATA 11,110,29,89πDATA 5,79,5,79πDATA 0,120,0,120πDATA 23,148,-7,151πDATA 33,180,-36,175πDATA 44,183,-31,182ππ' Frame 4.πDATA 40,78,80,76πDATA 25,108,51,79πDATA 18,80,18,80πDATA 0,120,0,120πDATA 27,149,-6,151πDATA 36,181,-34,174πDATA 47,183,-29,183ππ' Kick.π' Frame 5.πDATA 26,79,16,87πDATA 20,104,13,110πDATA 2,80,2,80πDATA 0,124,0,124πDATA 19,153,-5,156πDATA 21,186,-20,186πDATA 31,189,-16,192ππ' Frame 6.πDATA 2,82,14,79πDATA -5,106,11,102πDATA -1,73,-1,73πDATA 0,114,0,114πDATA 19,143,31,127πDATA 22,176,16,158πDATA 32,177,22,165ππ' Frame 7.πDATA -14,98,10,76πDATA -27,112,8,99πDATA -11,78,-11,78πDATA 0,119,0,119πDATA 5,149,38,117πDATA 8,183,9,138πDATA 15,181,8,149ππ' Frame 8.πDATA -13,97,11,68πDATA -24,117,8,90πDATA -13,86,-13,86πDATA 0,125,0,125πDATA -14,156,37,123πDATA -28,190,70,125πDATA -22,188,63,119ππ' Player got hit.π' Frame 9.πDATA -5,129,23,112πDATA -13,101,7,98πDATA -9,76,-9,76πDATA 0,119,0,119πDATA 6,147,21,147πDATA -14,174,30,178πDATA -8,180,41,178ππ' Player data.πplayer(1).xpos = 60πplayer(1).ypos = 0πplayer(2).xpos = 260πplayer(2).ypos = 0ππFOR i% = 1 TO 2π player(i%).mframe = 0π player(i%).tframe = 0π player(i%).frame = 1π player(i%).strength = 30πNEXT i%ππsplat.frame = 0ππ' Instructions.π SCREEN 12π LOCATE 6, 1π PRINT " Left player controls: Right player controls"π PRINT " ********************* *********************"π PRINT " 'A' - backup 'L' - backup"π PRINT " 'S' - kick 'K' - kick"π PRINT " 'D' - punch 'J' - punch"π PRINT " 'F' - forward 'H' - forward"π PRINT : PRINTπ PRINT " 'Q' - ends program"π PRINT : PRINTπ PRINT " Press a key..."π DO WHILE INKEY$ = "": LOOPππ' Main game loop.πDO UNTIL gameend$ = "Q"ππ ' Get player input.π p$ = ""π p$ = INKEY$π IF player(1).frame = 1 THENπ SELECT CASE UCASE$(p$)π CASE "D" ' Punchπ player(1).frame = 2π player(1).mframe = 1π player(1).tframe = 0π CASE "S" ' Kickπ player(1).frame = 5π player(1).mframe = 1π player(1).tframe = 0π CASE "F" ' Forward ' Change this to a quick step forward animation.π player(1).xpos = player(1).xpos + 7π IF player(1).xpos > 280 THEN player(1).xpos = 280π CASE "A" ' Backward. ' Change this to a quick step backward animation.π player(1).xpos = player(1).xpos - 7π IF player(1).xpos < 20 THEN player(1).xpos = 20π CASE "Q"π gameend$ = "Q"π END SELECTπ END IFππ IF player(2).frame = 1 THENπ SELECT CASE UCASE$(p$)π CASE "J"π player(2).frame = 2π player(2).mframe = 1π player(2).tframe = 0π CASE "K"π player(2).frame = 5π player(2).mframe = 1π player(2).tframe = 0π CASE "L" ' Backward. ' Change this to a quick step forward animation.π player(2).xpos = player(2).xpos + 7π IF player(2).xpos > 280 THEN player(2).xpos = 280π CASE "H" ' Forward. ' Change this to a quick step backward animation.π player(2).xpos = player(2).xpos - 7π IF player(2).xpos < 20 THEN player(2).xpos = 20π CASE "Q"π gameend$ = "Q"π END SELECTπ END IFππ ' Check for collision.π ' Player 1 attacking.π xcheck% = 0π IF player(1).xpos < player(2).xpos THENπ IF player(1).frame > 1 THEN ' See if player is throwing an appendage.π ' Check basic boundary box.π IF player(1).frame = 4 THEN ' Move was a punch.π xcheck% = player(1).xpos + lh(player(1).frame).xposπ splat.ypos = lh(player(1).frame).yposπ ELSEIF player(1).frame = 8 THEN ' Move was a kick.π xcheck% = player(1).xpos + la(player(1).frame).xposπ splat.ypos = la(player(1).frame).yposπ END IFπ ' Check against player 2's boundary.π IF xcheck% > 0 AND player(2).frame <> 9 THENπ IF xcheck% > (player(2).xpos - 20) AND xcheck% < (player(2).xpos + 20) THENπ player(2).frame = 9π player(2).mframe = 1π player(2).xpos = player(2).xpos + 14π player(2).strength = player(2).strength - 3π IF player(2).xpos > 280 THEN player(2).xpos = 280π splat.frame = 1π splat.xpos = xcheck%π END IFπ END IFπ END IFππ 'Player 2.π xcheck% = 0π IF player(2).frame > 1 THEN ' See if player is throwing an appendage.π ' Check basic boundary box.π IF player(2).frame = 4 THEN ' Move was a punch.π xcheck% = player(2).xpos - lh(player(2).frame).xposπ splat.ypos = lh(player(2).frame).yposπ ELSEIF player(2).frame = 8 THEN ' Move was a kick.π xcheck% = player(2).xpos - la(player(2).frame).xposπ splat.ypos = la(player(2).frame).yposπ END IFπ ' Check against player 1's boundary.π IF xcheck% > 0 AND player(1).frame <> 9 THENπ IF xcheck% > (player(1).xpos - 20) AND xcheck% < (player(1).xpos + 20) THENπ player(1).frame = 9π player(1).mframe = 1π player(1).xpos = player(1).xpos - 14π player(1).strength = player(1).strength - 3π IF player(1).xpos < 20 THEN player(1).xpos = 20π splat.frame = 1π splat.xpos = xcheck%π END IFπ END IFπ END IFπ ELSEπ IF player(1).frame > 1 THEN ' See if player is throwing an appendage.π ' Check basic boundary box.π IF player(1).frame = 4 THEN ' Move was a punch.π xcheck% = player(1).xpos - lh(player(1).frame).xposπ splat.ypos = lh(player(1).frame).yposπ ELSEIF player(1).frame = 8 THEN ' Move was a kick.π xcheck% = player(1).xpos - la(player(1).frame).xposπ splat.ypos = la(player(1).frame).yposπ END IFπ ' Check against player 2's boundary.π IF xcheck% > 0 AND player(2).frame <> 9 THENπ IF xcheck% > (player(2).xpos - 20) AND xcheck% < (player(2).xpos + 20) THENπ player(2).frame = 9π player(2).mframe = 1π player(2).xpos = player(2).xpos - 14π player(2).strength = player(2).strength - 3π IF player(2).xpos < 20 THEN player(2).xpos = 20π splat.frame = 1π splat.xpos = xcheck%π END IFπ END IFπ END IFππ 'Player 2.π xcheck% = 0π IF player(2).frame > 1 THEN ' See if player is throwing an appendage.π ' Check basic boundary box.π IF player(2).frame = 4 THEN ' Move was a punch.π xcheck% = player(2).xpos + lh(player(2).frame).xposπ splat.ypos = lh(player(2).frame).yposπ ELSEIF player(2).frame = 8 THEN ' Move was a kick.π xcheck% = player(2).xpos + la(player(2).frame).xposπ splat.ypos = la(player(2).frame).yposπ END IFπ ' Check against player 1's boundary.π IF xcheck% > 0 AND player(1).frame <> 9 THENπ IF xcheck% > (player(1).xpos - 20) AND xcheck% < (player(1).xpos + 20) THENπ player(1).frame = 9π player(1).mframe = 1π player(1).xpos = player(1).xpos + 14π player(1).strength = player(1).strength - 3π IF player(1).xpos > 280 THEN player(1).xpos = 280π splat.frame = 1π splat.xpos = xcheck%π END IFπ END IFπ END IFπ END IFππ ' Determine if a player has lost.π IF player(1).strength <= 0 OR player(2).strength <= 0 THEN ENDππ SCREEN 7, , 1, 0π CLSπ ' Draw background stuff.π LINE (0, 150)-(319, 150), 14π FOR floor% = 160 TO 0 STEP -10π LINE (floor%, 150)-(floor% - (160 - floor%) * 1.2, 190), 14π LINE (320 - floor%, 150)-(320 - (floor% - (160 - floor%) * 1.2), 190), 14π NEXT floor%π LINE (0, 190)-(319, 190), 14ππ ' Draw players.π IF player(1).xpos < player(2).xpos THENπ ' Draw player 1.π ' Draw right side.π LINE (player(1).xpos + rt(player(1).frame).xpos,rt(player(1).frame).ypos)-(player(1).xpos + ra(player(1).frame).xpos,ra(player(1).frame).ypos), 1π LINE (player(1).xpos + ra(player(1).frame).xpos,ra(player(1).frame).ypos)-(player(1).xpos + rk(player(1).frame).xpos,rk(player(1).frame).ypos), 1π LINE (player(1).xpos + rk(player(1).frame).xpos,rk(player(1).frame).ypos)-(player(1).xpos + rw(player(1).frame).xpos,rw(player(1).frame).ypos), 1π LINE (player(1).xpos + rw(player(1).frame).xpos,rw(player(1).frame).ypos)-(player(1).xpos + rs(player(1).frame).xpos,rs(player(1).frame).ypos), 1π LINE (player(1).xpos + rs(player(1).frame).xpos,rs(player(1).frame).ypos)-(player(1).xpos + re(player(1).frame).xpos,re(player(1).frame).ypos), 1π LINE (player(1).xpos + re(player(1).frame).xpos,re(player(1).frame).ypos)-(player(1).xpos + rh(player(1).frame).xpos,rh(player(1).frame).ypos), 1ππ ' Draw left side.π LINE (player(1).xpos + lt(player(1).frame).xpos,lt(player(1).frame).ypos)-(player(1).xpos + la(player(1).frame).xpos,la(player(1).frame).ypos), 9π LINE (player(1).xpos + la(player(1).frame).xpos,la(player(1).frame).ypos)-(player(1).xpos + lk(player(1).frame).xpos,lk(player(1).frame).ypos), 9π LINE (player(1).xpos + lk(player(1).frame).xpos,lk(player(1).frame).ypos)-(player(1).xpos + lw(player(1).frame).xpos,lw(player(1).frame).ypos), 9π LINE (player(1).xpos + lw(player(1).frame).xpos,lw(player(1).frame).ypos)-(player(1).xpos + ls(player(1).frame).xpos,ls(player(1).frame).ypos), 9π LINE (player(1).xpos + ls(player(1).frame).xpos,ls(player(1).frame).ypos)-(player(1).xpos + le(player(1).frame).xpos,le(player(1).frame).ypos), 9π LINE (player(1).xpos + le(player(1).frame).xpos,le(player(1).frame).ypos)-(player(1).xpos + lh(player(1).frame).xpos,lh(player(1).frame).ypos), 9ππ ' Draw head.π CIRCLE (player(1).xpos + rs(player(1).frame).xpos + 4,rs(player(1).frame).ypos - 7), 7, 9, , , 1.25ππ ' Draw player 2.π ' Draw right side.π LINE (player(2).xpos - rt(player(2).frame).xpos,rt(player(2).frame).ypos)-(player(2).xpos - ra(player(2).frame).xpos,ra(player(2).frame).ypos), 3π LINE (player(2).xpos - ra(player(2).frame).xpos,ra(player(2).frame).ypos)-(player(2).xpos - rk(player(2).frame).xpos,rk(player(2).frame).ypos), 3π LINE (player(2).xpos - rk(player(2).frame).xpos,rk(player(2).frame).ypos)-(player(2).xpos - rw(player(2).frame).xpos,rw(player(2).frame).ypos), 3π LINE (player(2).xpos - rw(player(2).frame).xpos,rw(player(2).frame).ypos)-(player(2).xpos - rs(player(2).frame).xpos,rs(player(2).frame).ypos), 3π LINE (player(2).xpos - rs(player(2).frame).xpos,rs(player(2).frame).ypos)-(player(2).xpos - re(player(2).frame).xpos,re(player(2).frame).ypos), 3π LINE (player(2).xpos - re(player(2).frame).xpos,re(player(2).frame).ypos)-(player(2).xpos - rh(player(2).frame).xpos,rh(player(2).frame).ypos), 3ππ ' Draw left side.π LINE (player(2).xpos - lt(player(2).frame).xpos,lt(player(2).frame).ypos)-(player(2).xpos - la(player(2).frame).xpos,la(player(2).frame).ypos), 11π LINE (player(2).xpos - la(player(2).frame).xpos,la(player(2).frame).ypos)-(player(2).xpos - lk(player(2).frame).xpos,lk(player(2).frame).ypos), 11π LINE (player(2).xpos - lk(player(2).frame).xpos,lk(player(2).frame).ypos)-(player(2).xpos - lw(player(2).frame).xpos,lw(player(2).frame).ypos), 11π LINE (player(2).xpos - lw(player(2).frame).xpos,lw(player(2).frame).ypos)-(player(2).xpos - ls(player(2).frame).xpos,ls(player(2).frame).ypos), 11π LINE (player(2).xpos - ls(player(2).frame).xpos,ls(player(2).frame).ypos)-(player(2).xpos - le(player(2).frame).xpos,le(player(2).frame).ypos), 11π LINE (player(2).xpos - le(player(2).frame).xpos,le(player(2).frame).ypos)-(player(2).xpos - lh(player(2).frame).xpos,lh(player(2).frame).ypos), 11ππ ' Draw head.π CIRCLE (player(2).xpos - rs(player(2).frame).xpos - 4,rs(player(2).frame).ypos - 7), 7, 3, , , 1.25ππ ELSEπ ' Draw player 1.π ' Draw right side.π LINE (player(1).xpos - rt(player(1).frame).xpos,rt(player(1).frame).ypos)-(player(1).xpos - ra(player(1).frame).xpos,ra(player(1).frame).ypos), 1π LINE (player(1).xpos - ra(player(1).frame).xpos,ra(player(1).frame).ypos)-(player(1).xpos - rk(player(1).frame).xpos,rk(player(1).frame).ypos), 1π LINE (player(1).xpos - rk(player(1).frame).xpos,rk(player(1).frame).ypos)-(player(1).xpos - rw(player(1).frame).xpos,rw(player(1).frame).ypos), 1π LINE (player(1).xpos - rw(player(1).frame).xpos,rw(player(1).frame).ypos)-(player(1).xpos - rs(player(1).frame).xpos,rs(player(1).frame).ypos), 1π LINE (player(1).xpos - rs(player(1).frame).xpos,rs(player(1).frame).ypos)-(player(1).xpos - re(player(1).frame).xpos,re(player(1).frame).ypos), 1π LINE (player(1).xpos - re(player(1).frame).xpos,re(player(1).frame).ypos)-(player(1).xpos - rh(player(1).frame).xpos,rh(player(1).frame).ypos), 1ππ ' Draw left side.π LINE (player(1).xpos - lt(player(1).frame).xpos,lt(player(1).frame).ypos)-(player(1).xpos - la(player(1).frame).xpos,la(player(1).frame).ypos), 9π LINE (player(1).xpos - la(player(1).frame).xpos,la(player(1).frame).ypos)-(player(1).xpos - lk(player(1).frame).xpos,lk(player(1).frame).ypos), 9π LINE (player(1).xpos - lk(player(1).frame).xpos,lk(player(1).frame).ypos)-(player(1).xpos - lw(player(1).frame).xpos,lw(player(1).frame).ypos), 9π LINE (player(1).xpos - lw(player(1).frame).xpos,lw(player(1).frame).ypos)-(player(1).xpos - ls(player(1).frame).xpos,ls(player(1).frame).ypos), 9π LINE (player(1).xpos - ls(player(1).frame).xpos,ls(player(1).frame).ypos)-(player(1).xpos - le(player(1).frame).xpos,le(player(1).frame).ypos), 9π LINE (player(1).xpos - le(player(1).frame).xpos,le(player(1).frame).ypos)-(player(1).xpos - lh(player(1).frame).xpos,lh(player(1).frame).ypos), 9ππ ' Draw head.π CIRCLE (player(1).xpos - rs(player(1).frame).xpos - 4,rs(player(1).frame).ypos - 7), 7, 9, , , 1.25ππ ' Draw player 2.π ' Draw right side.π LINE (player(2).xpos + rt(player(2).frame).xpos,rt(player(2).frame).ypos)-(player(2).xpos + ra(player(2).frame).xpos,ra(player(2).frame).ypos), 3π LINE (player(2).xpos + ra(player(2).frame).xpos,ra(player(2).frame).ypos)-(player(2).xpos + rk(player(2).frame).xpos,rk(player(2).frame).ypos), 3π LINE (player(2).xpos + rk(player(2).frame).xpos,rk(player(2).frame).ypos)-(player(2).xpos + rw(player(2).frame).xpos,rw(player(2).frame).ypos), 3π LINE (player(2).xpos + rw(player(2).frame).xpos,rw(player(2).frame).ypos)-(player(2).xpos + rs(player(2).frame).xpos,rs(player(2).frame).ypos), 3π LINE (player(2).xpos + rs(player(2).frame).xpos,rs(player(2).frame).ypos)-(player(2).xpos + re(player(2).frame).xpos,re(player(2).frame).ypos), 3π LINE (player(2).xpos + re(player(2).frame).xpos,re(player(2).frame).ypos)-(player(2).xpos + rh(player(2).frame).xpos,rh(player(2).frame).ypos), 3ππ ' Draw left side.π LINE (player(2).xpos + lt(player(2).frame).xpos,lt(player(2).frame).ypos)-(player(2).xpos + la(player(2).frame).xpos,la(player(2).frame).ypos), 11π LINE (player(2).xpos + la(player(2).frame).xpos,la(player(2).frame).ypos)-(player(2).xpos + lk(player(2).frame).xpos,lk(player(2).frame).ypos), 11π LINE (player(2).xpos + lk(player(2).frame).xpos,lk(player(2).frame).ypos)-(player(2).xpos + lw(player(2).frame).xpos,lw(player(2).frame).ypos), 11π LINE (player(2).xpos + lw(player(2).frame).xpos,lw(player(2).frame).ypos)-(player(2).xpos + ls(player(2).frame).xpos,ls(player(2).frame).ypos), 11π LINE (player(2).xpos + ls(player(2).frame).xpos,ls(player(2).frame).ypos)-(player(2).xpos + le(player(2).frame).xpos,le(player(2).frame).ypos), 11π LINE (player(2).xpos + le(player(2).frame).xpos,le(player(2).frame).ypos)-(player(2).xpos + lh(player(2).frame).xpos,lh(player(2).frame).ypos), 11ππ ' Draw head.π CIRCLE (player(2).xpos + rs(player(2).frame).xpos + 4,rs(player(2).frame).ypos - 7), 7, 3, , , 1.25π π END IFππ ' Draw strength meters.π ' Player 1.π LINE (20, 10)-(player(1).strength + 20, 14), 15, BFπ IF player(1).strength < 30 THEN LINE -(50, 10), 4, BFπ ' Player 2.π LINE (300, 10)-(300 - player(2).strength, 14), 15, BFπ IF player(2).strength < 30 THEN LINE -(270, 10), 4, BFππ ' Draw hit graphic.π IF splat.frame > 0 THENπ LINE (splat.xpos, (splat.ypos - 5))-(splat.xpos + 1, (splat.ypos - 2)), 12π LINE -(splat.xpos + 4, (splat.ypos - 3)), 12π LINE -(splat.xpos + 2, splat.ypos), 12π LINE -(splat.xpos + 4, (splat.ypos + 3)), 12π LINE -(splat.xpos + 1, (splat.ypos + 2)), 12π LINE -(splat.xpos, (splat.ypos + 5)), 12π LINE -(splat.xpos - 1, (splat.ypos + 2)), 12π LINE -(splat.xpos - 4, (splat.ypos + 3)), 12π LINE -(splat.xpos - 2, (splat.ypos)), 12π LINE -(splat.xpos - 4, (splat.ypos - 3)), 12π LINE -(splat.xpos - 1, (splat.ypos - 2)), 12π LINE -(splat.xpos, (splat.ypos - 5)), 12π splat.frame = splat.frame + 1π IF splat.frame > 5 THEN splat.frame = 0π END IFππ PCOPY 1, 0ππ ' Adjust players' frame.π FOR i% = 1 TO 2π player(i%).frame = player(i%).frame + player(i%).mframeππ IF player(i%).frame = 4 OR player(i%).frame = 8 THENπ player(i%).mframe = -player(i%).mframeπ player(i%).tframe = 1π END IFππ IF player(i%).frame = 1 AND player(i%).tframe = 1 THENπ player(i%).tframe = 0π player(i%).frame = 1π player(i%).mframe = 0π END IFππ IF player(i%).frame = 5 AND player(i%).tframe = 1 THENπ player(i%).tframe = 0π player(i%).frame = 1π player(i%).mframe = 0π END IFππ IF player(i%).frame > 9 THENπ IF player(i%).frame < 14 THENπ player(i%).frame = 9π player(i%).mframe = player(i%).mframe + 1π ELSEπ player(i%).frame = 1π player(i%).mframe = 0π END IFπ END IFππ NEXT i%ππLOOPπAndre van Wyk QBASIC GAME DESIGN TUTORIAL Commander_Omlette@prodigy.com 10-19-96 (13:24) QB, QBasic, PDS 317 20929 QBGDC.BAS DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"QBGDC.ZIP",4^6:Z&=15440:?STRING$(50,177);πU"%up()%9%'%R-%\ORaBD\(6J0)7%%*-%%%.%%%%ns%ywtS^y'y&jzF]URi57*Bk$πU"yA/(jij+'=*.+j,#iUk1RorV7>*t<PQ&M8F(,WfGv9&P,E,iWXyk6E%(',+)k?uπU"Rg'sHw31nuwqpdQP+O^i)TzfHVg?9[?8Hq=-&d6:?3Xkiq7:YsbtQ;NH&]L#29FπU"F4-4z#DGF2/V:Mx^>-8B?f2CaH%>HyX2;2b5+c1-4$lpQCV1*JgH&k'tOQ7JEkdπU">L$X>]$O.$oH*)iLd)Tu0o#a*s0fTi8:_maJ9#U&b#'#HqcF(L1w];1\ES0F#?FπU"8FY/BNeopgSpJbbgny6$1h(W1%BrEtgkPo1M^4I[nrS>-eFZ)$_JHP&G2f:sTlbπU"IM%jz$p=BG7DtRD1eskGHer))4EcIq47f:k.pEM[&<Kx&#O/hkwk)m0Ti'liUF(πU"CGjL+wgy=BGYUc;T=QL3cTtc'gNN#*jTGC;zRA*M\j&+Swr'V':JfxcD[o2C1-UπU"(sR^/pBCZ[y.tH_80O^72hB#A,/0Z<$0p&df8m,VWF#;<ihhtnkf9lF/cqUx&j5πU"9\n:6*^tb=?fE\#Q4:UZ\Hm&q0w/RDVNmd<tE[eL-5WlogI0kR3BBBNGajeEg?aπU"PKF%i21gposCpkXGG'l5(H(;;+aja$Wfr?%Uc.o=7=)BxS$JSw?.OO#DcVs.tb^πU"+Gmt/wL1fGMQ[Y7/rk4=xkoAT.Q?lUuGt1p7fTk_w(K&ut%Flb=2/H_p-jIxZ]$πU"$)4k)G2Ll4t%bGJcQ)rDwn]Z2/isHWH22iis--)ehcxbM1nzQ9I8)xik(=&'L+GπU"rnZ^+o0nNBt#lJwU^C,YFsW33,tq#L1McIBJPJ,(;d$T1cuN)Ci'%L*D/s>joj\πU"goQ(RO1MdpVLWkO+GH(LE<1cNah7X9rWMcx\$Q>^*/]Jw6gfOx^rgBMTV#3Nql2πU"HX+]yS25/r[/OJVpePSrVBRip8jR2lG#H9&o%i10LM,,)&ux7Ws9rT+ZqkN9K[zπU"1)E95>SL\F>=HhY#Z>K$T3qbWop&2OY3OEq<wDFrsAUV%u=dM)fq<=i,pU>dN&6πU"(Y)OUIfE^;m'v4+Cp1cLP]PgeL:?>)Tw^r)i-r^mtu/?tUQmTj%kO.SFfeM=oiMπU"N-xYHg+Ato4o/7tZlow%N%r=T;m/O6DDcC]L?vcqf<m5x17=RT[qnTGK)Eh.Z&yπU"[<GIoefq_w7gLJO;Bz3&RyLk(+S::f?*B),ZpKkGm(pibvXomM?Q%MIMG>B_j9jπU"EIg$9J[%[$taWJ\=+=C1X$t3k#Z9VknUv#f3LwXYN6-t9nh2UJ#=?$J:'t?xLK%πU"nxEW4qqTk0&CQrx-4'jLup%()9%%'%-%)/TaB6T.UO&y=%%*u.%%%1%%%%vgfx%πU"lihV%SUUVW-(h=cU?6x:sOhU7G'Qg0G,lwbo'B#)_4>;nqm'%?;F#bVAHU7?2DeπU"Sk^ZB^(hP%*5Y;>uSoeWu=$,4a8m9R*$Km&rsigGxcrFDvut\w$;>Ho0>KYu;e%πU"0GF:k':T>Ho($Pvwm62HErP<xMMb#1go_Ak>*\OC987'RR,+]hss8+$2)$E/:RpπU"rN*x)OYS)?.2,*?HGN78<6FE]HqlP5%j.qzQY?]RpuC'OFwcfwC2Ck>g1:nZkdLπU"ZptHogsHuk+Y,&UD%808<kr-eDsDogskp;G$Ktn3wDdJv\-n/bs(NU)sNqA#l]jπU"_i>1kQp-/0lEzdfSZq-A-NNk/bAIzG9.:y0m<.',KYwS>/YIUW(tL/InJz*mcYUπU"iI(Whv=yc/j13-MMNJ7B245hPdea7IDmf]I.nZ[3YoGgP4;s3-sUPyCZPrdLjNGπU"(p^F9$:)ua[cm-]_14DoTD:a(57g\_=LL7q+X>g_+RN-j[4lhF[I?Te-EZ+Kq&eπU"EY+02gB;he=^%2#duZs5=[%5j1bSyi]BA4C[#bQ9+U.fLoMk0)='_izSm^VpU^^πU"8YUt/&lolL-3Z()^t$oI)7aGIS.QeT/'c]Y^gRV%B:/V1mCAtLk;L?f6F:>SinKπU":BlOLVL_6?XdWXEc4*dsk(2?8BDQmX+UR=r.63XtIgx>uH,d,Who[aI$sA7Ft58πU"tKd2n.gbm$U<89Q%[19DKLZcLu_.mb?bBOV#5*'k*Q_HW\NKU&gO;:I<0P$=EK>πU"vtdhj1k+cmI8kCl*59X.8$RGSG(g>/iX6-G,PJ(XqCng;[<x+AssPk7#cGf&uj^πU"G0AZ0tp^'JpzobIP<.&=udNjM.7%'2%7hWI\;te)Wn[Q)/ApMdVhM#oGy1R\,'lπU"/?MUGo'$DrmC:Vpi>+jYW/rZhpO8hNSPXvPU?jzgA<Oxb*=4irSMIVT[hKDf#S-πU"mB9DgdMKk72%u18zHx(K89m])A2&dc$Rb<]w(VtHPmJK8M2$mKqi^D_l&^Ufb5hπU"7T1te#a9m58%,N480-:.9\Woj1;*o*_qrdg6\y:9ZACf?YECZP9-ZR.,>3#i_rHπU"aGD4atOM&[v<gtkFuYmQqoi2K;r,0.%tB96g.CH=1BygjT.9TcMHQQMwf39DN,sπU",)('g,#+5KaojawTo##W.y_dQ>XqZiKBh\;R]]wb9Th#oWpwT^c6?u:Ru8/b,;]πU":;LB=gcIH1\_p-ZwuS32kq:d>1dV-UelS*M;2$jq%V&H_s#k/OYF(S'VH,5ojxdπU"z_G#m8#-2bl)^H7-fi+bQ$'qbA,I#QHe(_dk*MRR5B^^B#(ja*$H&JodR0t,'\tπU"?lWkEf98xji7NI,S<=PPTPea,t.osoqjl.Tkd_6otpDl/;C.\MmtKnc-C-V\1R#πU"%Oqp6Dh)]=W0bG/jAY,&qHyf447w\x)HAa#=Aaa$=;9GKxf>#;&wwsw1?8Z090+πU"L&6%G>t-CXoV#D^\eE+D%lp[JY3&>u[l1KR'Hb0jB?kukPObMB,cCrQ/GT/Z9(8πU"jNHeN-QgL6g+LWobU;VYNi:ZMr7_%BoMDkcqe.bwQ5bl+lYnI=ib$_[C3o;w7(cπU"ip*cAwbNR3j&(]*wL/BiX8+Wj$c*.Vf+PgF$UvcsA]RBN]yP\oMna]NE(k=RYoAπU"o2_)F*_Y*?5&u[$(PGKH%^)0(mJDk/G_=15vm<Un_Kc?E-DTjPG;ICX9PJS,mcvπU"n+KKlaJzLbVBY=SnAvg<X5OADbTk<9sL##CQS+#8'uzcQZaS/A5<L/xE27>))snπU"EBsiCBpgSf<=e%f;)/gca/BRnWisKRc;7r1\66%u/t'su^-UwW8T&]c<<sAN2)QπU"a\<M;(kYmr,zG,dC,[fXiiOh(k_R-IwH*R?0tA^71pKMv[CBHk[-is?le&pzek7πU"1*4\sjuI0V,m&(qHj3%aGqLIJ,gml,<2>.+1oedBQE&)hcTIPOc)/tEdhIzHK*2πU"FF[HU+p>IZbm6]J?=s^5KN8)Y;59NIzM#2,q_.9zkiGt#ZYmPAG?MOr#)HET1BBπU"=[T3Z9i*H;l=FEbf=FJ2-l)]pv-wOx#\oC+WPX61#du.#?$s/#IaH1U8DUL(BWlπU"<BCwv6<3]SGOL?9S5B[I(e31C);hR).I5,'cC.9c;e91'UcAI5R&:pSgOss<raYπU"=kKE0;E80MeGtO0]O+C=fh0DCpG%g(GXNkGN#5Eo=?E4Ukc%211PIVZG'HH5%0XπU"o*xn]=4G%TgF9\3O/#oD%IEObZ9_:O#cOu\8$\;)M')Ldu$OP1MQJ,H0MzZWI8ZπU"X+Fg(oLtv;?uQS<:/W(mCB^GJ256m%yBQwN/CJUKuDImz+2I1'vrpk*=^&BL6c8πU"ft0)m#19T]UN5+i3Ue[z=)aI+?q1.XU\Y2HUl?iFPc^(1Ukp\iovcE[ccTP,[c^πU"Yr2Na8I+Hulb::xhEVB.#u1$_hY5\2Lezrrd;QpxN,V+Noi.PxKjtn?pbohjUsAπU"Ic/plFopIKvjAnDhpWup037F[gH/>1mi<cpC2SOx=l(]Z-y\Xo^)FA0eP]CAR<PπU"/)5:7^k%o8ha2A^$]EF#'LY6B?5wXnc9&Q$:'9.kWZyZXP(0vWM9<f88a*BDr$0πU"669]cw4G/GVUgoQJpvQWNK<pOjCfr)Uhd-uIuUhSl$#[kpFU4:v'>FJ-2xkqrRPπU"^_h&<irJ)D>=t&r3r*,n[8g_+gUOOlKZ/F(xtrXS%,HF;D\vf.e6qY%aWqAi$w-πU"q%-P5qC1Dpm15LrD$6S4hW1+n^v;crrXMkeo,0A\.,<_DJgPj,RH:oZT;gVzj*RπU"NF)x1M?1-[e]fuMZ&C_&:qO^](v0&::F8T8US66c6o*pj+Q+8N&E3U+vv=)F24SπU"[T\%P]3EUM^=PI8eY[H^my/<19^N;9jd2CH:B=PZm>MHQh6KLR*DWm_.kj1Kv?%πU"zLaR(DGM1*n:fQ)8XotTXt0qxD2J[6Uh?#Dnq=)4e&qQybrd>3?M_0&xKfo/OE5πU";=:\pEsMNx_N+3<c&)NlRV]4tb0OZ0((e3DoBoPJ<(7pV=r16OESUY^[IZ(ajJ<πU"7f];:;<O*n)Jz,)[)oN;ACqzz*Q5.Um<_%5D$:6&Ro*mYA332g8NHUfbm6p46^LπU"j0s7_NnZRB08'NmXLbeIe)-K-^i7fcP?u57suUg\Ub[9v_=j,:x8XB>?_:l:j/SπU"&D$fiXmLxW>R-7()i3lm$,\jHCL^NkbWMv[29*UT5b4[.F=n,^_qs8g0z+e:^wnπU"q0'7=<=w$QTjLJ?$IkbU%>Dh2CZqpZ\\oJw#sp:]V6vR=FOC0hA39q6VPHp)c.mπU"PQX)9FLkBK+%jk)<8ZXYvrOnx6(I3K3)i1Upuofs]LjT+;>0tccuFoMWs$lQcqqπU"b[o&.%[(X:9wF[2fvV03Nh[fgp1+bVGj^7/Rhp)fkHo-HIaGwH+(wH3:8-8IU/$πU"9yg<;OL:j),Qhxkn#&1SyN0tO3CeYQ(E1hd'1f-&^/G,li5\PpAccPkq1q3cx-YπU"B.4<p#(m8X%6<S#rv6dg**],oVEg;/:$T<)X*]NZo\X'Vs3'4IwJxG?VPS,M'/$πU"fQQ0(mGJh1Vk.s?UAuDs_$Oa^<rZ?gUGBgbFrYQE5Av=25VrGmH,wX8Gd<,Io/9πU"YqV7Sen)',6/0N<q2Y5_US?H%vZwFa'UklWYQE%xxg>^[mtG9eM6.1(0Ep<oxkGπU"1W3A%n2.GF-h%,6V&2Vz*R6[%NlObVq9>e=(w_p^Wr%nJD9t^buF5ui[DsPI?'<πU"%'<7(lORrUZtFJ'Y8-R/6OhU\xhlHXl6W')'B1BTY*eGwq?nObNAY(%WVPY*Vx=πU"[J7W8.vR]U3dpRA;Aa0lqh]nOan:D-\STf)My<JAAvbUZ.L5C$J#NpE39;]'62KπU"&t0ckjT>.1'psdTWhHaV^<gR>-AJH_S=]C]O#fU^hNkeBHjLJ.Q5]pR\<mCjT/0πU"q)arOwXt\m[N,IhwzHh31)D[YpwR*6/iq9)KD*b0eu4BZ*')81.BW9HGR:1IVH.πU"Yq(LW_2HUN_(g80dqx/kXUDm[Q/]So^N/7&F3c#k[i,fj>KZ]_mX$*qWVqJ._?PπU")3;4RAoSJQ<p4-43:IPaJta+gOlZNJrXU?/JKZ&oueLj&>r]V[TNPGX>,GLNkXAπU"8IpxW5&dIf%[-MF?8y.HfsPenw%)e'CIHReKDdJm=:?xaqgM9M[Flx>j^]/rxv&πU"ws8ZuvLskNsm%.A:qup?k]=S<$#6$WGKV>?c+n]*F#W#oza#vH,P?Q[\l/oJ(IMπU"$LUDd8Xh,0j&xSrTZG;Cic$YYI)_f:EJW6=wt6D3qZDbAok;M,RL.^5I[Q6lNp_πU"o)D#quq#*vr5^HHa3Q*Zsk=kC6I7GmXajFAnml>FOyA0&,[bytQ'E6A0d?=q:tBπU"ZM:YG*)oG*Ra^8C.)$xx&<.Jb4KsRVOha'MjEBq[SB&j#--EaUFvE5Gs8aHDUd;πU"g<CLM0I$>pT2ih[h\QfkOWA/3pEL8mIfKF..miP]a<cR4ljR2syIHNGU>Ex8p#CπU"YTFz.0S\5c+bHm#(.KSoS^N?f*GYQujZs)5Mr(i'i9UJ-\+yg7?U4d4Q]ob:_.8πU".XfJjEzNkYT0Bk2v^Me)K#o5U'K_YGgpJou8VVutEujlEp2w\-Njxueptku6u.XπU"Xd,Xz-Cp,Bfva>UQ0jum9T<>rJGcz>3Bh];0:15*EJRM&%$3bW\0ORY'v_1<7u7πU"jPB6n=d]7<H4lNlH?+cE.,_iOIfpR?o-'Cj9:u>)6U%3g2IOGH(;UIYa$0uv,PuπU"m_e](NQV%F4a5hP&R$OnY.dcj;GB?_e*ZBq8aWa0u*D_GoEV1lKMEAI.:a)6RYaπU"2k+pJldU,>o[fuNi\0HC*o,PcrK[o.UR^^)rIdDnk]Sy_VQLwMWR*coz#5n=/hUπU"ulfNoV?qFBfiediiY1].8DC^AD:oYA4x$(p6:,N5x>EN'7yo.gW$Z()V6:5z't3πU"[8x(:=d?D5pc&#hUS-h?L=OC1:9/0$,mxPV+q?a,:3jR,\hNvkEW_UBSz&0'e?,πU"1_40F+<#rp$&UDTAl3WHL510:psfVQxq%rW4SOQq*HLPz7wK]Eaxq(lURS#:M<(πU"i\cR%LOSJQd]F(HUF\>DQ;9zPUT29AHmW8U#T(-PMq>T_>g9d1zcphg$uAg3OCwπU"c?u(k/_Y-sHUtY#/?_>rJ\Y:E6(8U&y83V'Y/P<]^=Eq=q[36/gc;<c3$-1$SZ*πU"t6x#IG]iRn^]XAs;QttAn'+hb5epa>1):3Ac1bl5(,W3Z&a6]*Nu;Z;>VR4M4%(πU"EWAE;JLJq%)NwShbaVEA+f'S2&Fqq:Z&t6/)hiipZJW_(Y=<ii&lxwa^5-KhPuYπU":P4.77Zo4o+URU\%Z#tiNm/DxYEF5>zmT2(>c,%KqZIcnw82rlGYs?J8sdsaa8iπU"nlg(dCZE[RkdFl$1GAZNGtS7E/sm_$5n+keO)q>R\wGn>?H=mBRMe0FxPY.)'q?πU"90Z-n>80uqN+2J27KXIDQD?(n5qZb1acLAT?MJYFMZU[_X^tL4fI?iYU#Z2)M8/πU"+>BHQa7b2,=/C5_Q*uF^i:MP7+)[Zo.^?ig:DBAk*=VX;/MPi#GwqsjwfhZx)asπU"I)a,jJ](9YDUvC26o8)MagHmr8ZW'fJBrP\lD2](LXm%Hq.p_AcnFOmQ:,3t/1KπU"F&i+HrL9dUqMc%jX'<i%%fNlBWDrMmKsr)RAS3<1a,09Dz)M#9,]&]C-SJ&CMfXπU"bl/N[U+>rY&</CV1&;nZ^>kKRuRK5;Bj=tl5Fi;pt=t]$UcbeB/rNGuv))g9p0MπU"_L&fRpgC1#(=>_AXSzC0*)B#R^Lv([1Xim8l<.5iUbZJipR,we3%yz1;#:h\EL'πU")H7*ax=gk#K6T/3=Z/7vVj[I<srla65,uK.yIdicf%A?GpWCGgZXM4b<n3:uIπU"mcK*3-63([II&0_1=c:\7Bt^%/Tfc;N0R%^gg^]8%J]oeFHCO/:xcEyAjwk4+e=πU"PnX5JaWC[^HdpXem,iQYb6/f9]E0Pldy50cb+URh3Rj6t/V<_^Zx5AngFN1Mam\πU"ACTdlpWm7IcbMvV]^WmRoX4oub4,0>;T^Wl(TF\k1VIj,ff<LuG>foWW7+'WJSgπU"Q8tOHzQR=iB7eT%_I.P[z/<UnZLCeF_neFSfPr&n$lLH)tmST&RtBP,l?LDpQ'^πU"j2/bqIkn]fonC-ML6YAxV<#8?1isJlvS$Ms4h(*0RMk;HZHyY\-dr+w-]pg7yNJπU"5]ia5;ms%M'iiz?.kchg]5zks/'C&3$Dc+CYu:ezF;eIs*BIdl41<fssNxGJo(EπU"E*hTgS6szNG$,sKI]8YQwmd^9_IC^8hq)kg)2WcS3qoC)bFE=)ZFMgXO%hz[3^dπU"j<3HB>HgwbpLwTonjOh%>.X2EsZWCJfZ1FR#I\N<bW0(?lK,XdW>>]gsxP>gON'πU"bGi3%DELE%wAM_uL1t',[+X,Yylg\FY=2bn#n>HpvP#aJJNU<j<YV2DEfT&=^>QπU"2&Nu>6x-YP9:OsR95En9CuItL.7h4';JqKio]R$STpa.?KI^Q4CnGt*m+v$eNaQπU"We+1*<Lot6Yp[dEMCtMZfioD\aPN&)EM>-0\xz5Dq?lh'-;TLo,ljF)8ihCkN(oπU"pa7Rxc.Xl4VG.:p'=n<e&s7NgB,hlp3;P-/Wc76:ZcU4hM81i1zMGU9Ii>p_B#NπU".V;To7vIOKAlPQ_yXo:&/+;6?+bpM1hQ+Z0+0ek6>=X-B1?^U%BG/?fJMWmLQ0\πU"2&(3#6:b+?x(Bto,ihDkd%>)[3('pwY6#6Y_s$0*R>i;2=H?0%E$A1]\_o5yeM4πU"asftO<B]K3aSO,AfK=e<6<nIM'aZfJwp>J8m6HaH3_]IvV9M5j)M97xq]Y]CJdwπU"=L.'a3$&XD]N+%+5=>:&pI.o4<9]n$\>%BDfwD0\;yx2<3SJWn<ck(Rb0XlEBU(πU"q2\BsD:oWHQt,(:Cr[%f/oN0bHa1VobECw*fR+xQrO34kpso=wD&>XG8zL7r+U=πU"YeEIWfi/mJ>$2CV.nfqdAALx:7>#>l)\3fb^gO^h%.>ISycf\<uWVTOPwye<I#4πU"[LPWJ9Hu;KOM+2FI-?(?xLw*HEn%Knh[z:r1SnOl21K7j3<=u4QjyVN[k]T[%f/πU"n&C%[]cq#OFocPgqvl\<mK+P+XXQnWUk9f7(.[HAvC)I0IDVJ13eaW[XEQ,G+d7πU"V;jSBJ9Z9%]Els:K5%#*%vI/x4^<^q8)'TQtQfp]JKbx.CP^-'2(d34;3*G<[NNπU"WG(^Iq9B9oIf[ydp^uxoi5N3QpXlgJVI)o1A]KdF_1[<O65_?C:n:7$3_UgCeC1πU"mXw,L?=CT#<*bJmfQ.Juc[mFYZkMSWOIvRlVV)nr6W=%7S+NBNNaHa8D^$RuQKqπU"+pQm]aJ+7^(VAY[j2LqE^SiQ$H]DYx?:G#aQFIM6OF\HObM)B1VQ[[9k4s1'IP8πU"7[r$u]ZL(u[6p(sDAI[\V:tLKcp+[u;E/jP<[9_WpTGpt3ZR>yF[P6Wj\_/jRY;πU"<[K';5wp\KQ3q8h^SaQE]1cD2d,O%erpCf)3;,),5J/=Y(3gwHp2Y464y4rb-^RπU"gqhy<mXtx6VH[2v:KP:Kds<eZl-#lri;lO/9B1-DC5,S:0Zh76nwOHtK3qn^elqπU"$LwkrR6<n_XdZ6P,Px?leG'RIw^[XSKCGw4v'jIGVtm/RD.eLX.%SeV:%,d%JKUπU"),9TqDYnA3U#i0XzOXS%%e%Jyf(qDbz5<$yPiA9d&IcE,,3F&&6BO2=:U\4Vgi,πU"EbO6n%D*h<L/W9SI'PDFKPuPe.='N'JM+mSLDJ*j]StUVvCd*kK41=vGB/.'+*]πU"BcJQZunksJ[emA>5Ci<=\j33N,G0op'-y$p_-:yF1Nu0;i_u#jVH&K^gq7VY+j^πU"6M'=_ShdZkD[\Gmj/IQd1Q_p6]Lt45t=,%hUjjNHj/.,>?j=iDBv<Ef:*[Xh9s3πU"6B7XCv2H4d#&YTlN>FX9uYnX'x,up%()9%%'%-%*?XaB/&365&.C%%*nd%%%1%%πU"%%vgfx%lihV%SUUWNf,<>d#^awRSexpcKAFKM]qdkI]8Ja/hx;^QJ&.AN/6BB'XπU"MZJun3NMGC0Q:6wOM];/P<S+3r,,XA)p:\]zjoYZWUai^hl2CMOHDYb>[*J$zKyπU"fqdnlGnxMfKw'ns<5P6?(AZ>YoZT^KkNHtsNHAx+N3gS?-rjbqjbXV'GSA#\2L(πU"Ru9w]jg7T=9q.rE%52W*>E&1.'kT[Lv.oYgXL5N[p)tH$>nkAb)b&F\wd'K>H=/πU"xuQ<0=Wcv)[sUNP4/t\WNG[:5q'M7(4p<oI6tC9nlw=^haW2J'4f3Yrj2RPV>$?πU"W7/l7Q&lusjEa9W-m%(^40Ix-5'bqLo02Zgo(V%fi*RcK5f;Iav/X4-QRlvC\(SπU"(+V:7XMmIxz9S#iS'N7+OY,%U9vwG6as1D13YX/1=Z>L-WduYusI;gYgf*1LJ'JπU"_Ttg2%irzSblC]KJt3C8oV>1+9h*2[1g5L>[L2\o0>qBcj:w\wUByB/d-iyKT?KπU"?3$G^31O8sYx$21v%'?qEyeRu[cWNAbI([euvRFmPZnzyM^lp$VA?OJbz029yNWπU"5TvAqxvuB=MYhHSDPT0TqyxAkMIDg&XEuV3Y2;WfeW?64uo1t#*tAyc\>vdT32FπU"fr.52mQj+BM42G$?h\CPJ[F%)i[A':?.hLH2Jhts.pl9+cZ.M(tYW[^>>vsfy2uπU">fK]svLst#[>=cfjj2:)e^?V7e:3HJN20B%G4z5EaK(2piM(KU]8mNPkvBQwjJlπU"9$8/lMoug)t]vRLF1jkeusN#Ojvt8^*dROWp&&fL-oJZAZ.'S8OklpVSlPeP'9nπU"Dho$)1DVi?vp2LmHXq.3kZN+<n5cW-t(6SRSqa=xcHCx'thGUAe#upO,E6/H^Z'πU"<pP:aR(y\pV:nN4[.qvk(-%LE2)Jb0c6IPVp<7;EN6]<_Y%s'r%+\jb:0zXGpAMπU")o4D,b_%_\MZXF]b;HysLHw#xi=*[>lru.,k-EpFu6*PbQm_8:hjjQEV4>wtJ\WπU";IhCL(TfF_5AV(X+sm*kynAYH'GT2zXi)''-b>%vW6okaw2b)aW<&'AUyFD[39XπU"JPQfS8ML;-%OBq=]['oD-X&KGc37)#DEY($[g;hrdQ'.$_VG[oeQfdOW+:FJ>^^πU"36GN\u\T?V(cebmUI-P^/rrQniKFk^juLa$c'dSz'aOFZ%s*XCzUZZsmCC*+Tq_πU"t\;aY'W>/\iS7q69LNOkxa4gk'914+/at'q)n1FUZf0mkzRW?JqLr>T%QWz?;94πU"Z-Fa%]biGLT(n5B*b&b)m%1NN4nF3-E)z*>s7h4poo:QX]Q5,PAjnPL[6\?vD)yπU"$FPJ>btz=oF^*0\n+,jewlGrrD^k0u=M,'Fk:,<62Q8#UBO.#gU>D)Duu)U(+uXπU"J58(87[Y$DiMchnh1gyi6_4A.dlQb92q#^[ZIr2F7ydLD:Z_nfLB_R5-v9[p.xxπU"LL&J'\YWAg^U1.C4a/dWO+;DC,+VeFW_t/[r-E^an[Zu/mf3'p]*a\c,36]0UC%πU"c^UtC39YOIG-?Z.:.m<r;D2on'\TMnuRHNoMK:bDOJ]b=5$WFlGXlg5P)SpYq-IπU"XQ)uBGBRc(G?lr8cEd)rhN;$4p.56u%Qi$AXU[oQA\TdKlu$8$pY>iD>lYk>h*mπU"*AEoQaGCXkuukX#j*FkOTM_d$#&ILoTVm#>_z7&lDhJU>TbG2w%b:ZOi5&n*^%YπU"Mm$a*:J#^UKK3ZJK[9sPudnoFY/qQ,k,KlnI;YG&N)D,?('Lv1B7M+.U9RXsq1?πU"$9L(sKuk(/$o=4t])_4U8SaP5F4]NgfR1+K'f0R[Fza5<uU^o_&RN,_Tt,ZFwwcπU"T&[D32Ik/PAVqm7=pp.VKa7^DDetk2Qs?%iguQT<&5DmG<2S5kf>,doRPNe'dF3πU"Ps[JoME=Fr6DK&Sl2X(&g]%kO=[.]BC1%ua9DR$/q2'U;TeuFX->mhoxjSV:.iXπU"*8.SnX-6G<exXJU*zgK>/CTt2vSaJCWmpMQ6z'[S>x+Dis;WR_Pm1AsKf[PxR[lπU"G)#**K;njBN^'q(CbOFyqh-8h9nK7F3?tcpK%<FtJoxQJY[H#l:Xj,g)2ovRUK,πU"F-?x][7I$$Wji5a-YJYx?_:LHp/?^FF4KDXf,LXCyHQ&&(,tan5vt>P/QNF54iZπU",22Ecpa?g>LCd?rvc-*\CEa&]UX/_tfQDoZNn>4-T_d;T*MKmanx<aEw;4-</*#πU"Nf(ip3=nhvkZnk#&95D'T<Xvs?i.E4'i%eeg7=rK<)j>LWoTi<O1>^zh?I.Xi+]πU"Q&n4'p<G\ngZ&nh+%'HHX^h:H$g1L2:PqIJmvFm[x'0-Q3R86/$1IIvylDM]n%aπU"irf03V)rjSN;2XPmEl^*8\(2>cu>Yio>Yi>+Yi#Za2es<]XeRXOuBm&es\u4jw0πU"lPn/<NIYn\eDetsgR#6CgpYDq1DfV'vd4HSxPh1'z6bB[uQgR,P=UvO3+H:=(T&πU"[9qA&V-kO,g1Pj2'g6DBHu0&(uCh>%P:40:Ie7AI4*=X.0IEhRVud*>RPT3?1+$πU"F[i1tx;K.n=*D5ssq2k[6sFd.s\Vs>=_-Nkt'9=\dGxK1-_O9X<o:=n_0[6q<%fπU",'N3*_5(Hgi4bIl5(v5^_T#4N#wk&\=^L;1ofRXf4i/XBR;eZN-EP$5WmVGmk.MπU"l+jtLfL?lsmp6J*&6IJq8VXAz<NoG)F'ta.0YfCa.yS%,40iQ&ZP>O\oaG8xqQWπU"/gsq$?v;l49mu&CkF)3d1Rp(hLwehIQr7WU/qk,bW7Vdmi2.Zq)i*'8kXGVgZ,'πU"4&.Cle&s2i=K02Gbi+nAShJcXHBV\pRnPCL(Hz.Yg\f5Sd3u6=-I),?bX*z0=A1πU"lFW=x;0-6P<31m5i/T._H#I9lo+7/QqgE&8UffbZ92yy3-580]rCfsw)puT(M%rπU"i=/+?pvQ21,fEUK;A[*?_fJ,/cu/nfso63I[c-LOC]^Ir>W$rw<SNp?Q);Al=.VπU"q#3T8*hTva&&Gq'MQN/FV$dB?IDPZPT98nA#neYesb(hnk/%8G$n2bN]IN<ReV)πU"k/-W.t2Az>^\0E>*)&[LVLf4gC>bcT_X7+Zq8s3W-0j:mdh&zN&E^57OAi_$C<&πU"[#$$k72$ACO7,ul'f0?LCPUl*equpSe;;^-5FR'1Z_#4S#<3uE=k9$;6',E/)<<πU"9q-n_m.EybVlFYP=Njc8O:=H[^MLA#($(b6:8&-kiF>9b61_,BU-]ZC=T5s;3u^πU"'sOj6Vmd:%]u>206wb[S'.7;W1/SPQaq<75#a5?TH/ORHl%1C3uH1$GX(IRgaCtπEND SUBπSUB V2πU"L?1V55ED/IPafM,S0gkq?=P(M26QXf[&E+;40cXv*akFx;7;e5qp+(*FYHNOOmNπU"qUW)8*6f2)$oq',L7FwAq-NZ<ABaTNQ$ZsX;WBDJxi&C2[/kTr_%6HV38,UnI&/πU"tgQ;<41o0h(h.%0-Wb[7_uCJ/rm1:$p7KHhG2XLA#Wk/\d\=?s];JuFq_f)[bZ*πU"L6<-Y;aVoS0cY'UGh=/GFg#)B/6LV(h]JoCvafGM#+lufE')#np\Ct**d<q3Vh(πU"Z%RSXn.+m?oZ#jhvL(=&)&6tY*lMQY)lxk2W[4oM]4Mum3;)Yif3Nh?:wIk>RZ:πU"f2Dnm\Z?wL:aJt%j4/(7P&7ZT<Y7u+HrveRI6Dh01.z^,f0uiZ?$/cSaZH;+N2=πU"9'uF)3*WNB2xdXhy>dS[>Zt^&LC_)Im)h),I[Seut/sJG6Mlo_x^Zf3h(_W4#beπU"F>0p;yIX6Z,f+l)))0c\QT;R7T;RT+;RT;6RXijD%;'IBDQ8ZGw0zzWXRY'Gz)tπU"ukX'\phY,)Jf[ezX:OGlw6mLe-6$^kB5.9v4,lL[yaOr:m2*7gv%^qDymD(</=CπU">oEX)n(P9QsTq6QFcvYi7C;t(Oi22k'E,e0->HlR;+G>>x/Gt5$N2mG0?MR0G/QπU"PVaU%tF/[e3T,AkE;%/n?ovG\'2bUOmJ'37eic#Op8jXTE_NdnID\Tyrr5PN=IRπU"Xj$(zN/E7C02aqfL*.;1&yf%M/NU1+Q$%-oROI4GED3S=N)rQXQ?JriOl=6TZwKπU"P^PCW:'UlS3+Ec\KEJT*fm]4T<^p#iE45QVJrnj'I,+g*CtQLk5%%m*X&^Rn?0GπU"_&F<4?[]pt3<gvsPa#K$jrU)+\J)KE>4aXf969\XxkkQJ-iTr:fF8$&kh<TwXLNπU"uMvYwst#un_Y]Q:[5]dq;GjI%W*EnVJ,^5A,OYCSY2(<=QeZbl.kJ'Wu)(9bS[gπU")izXS;TU5MAccjVHe6Madc*W5DK(ILnY6RXCTacTGXe<qAnGj-L:qnQOj7M,1ILπU"Y<L^'bmoHR'i%Qa&6>g\Ah(ckt(jIiAdNQbBCqm^j9%*H(Z%606fXYb?poaJWw>πU"-Ei*2Y%_CFg;5^7L^QvkvH6&L_h[oePtnV#o=/fY2w]Hq/D<ZNKS:oCDCI=LYVwπU"vUgH1+pTxLJFLOTj)g^X6[lFXj7)3cu-BbY1egES>P:;qmY4p.VuI+KxD(cLn+hπU"1u%F,RxWtC9l\BWuuR&T0$zRT(oGSy^x2Kd91#FhJ,q&ggDVRsJ1doQDeX%T-7XπU"[7c=U:qsAi'fY#s+7L%h14+VX:IPJJTQmYJg\ab/oWBb-BMOAi%ee].\w4N=#hbπU"xJbBQ&Qarr/j)Pe<5+x/C9[\Gb?/M;hrh+Lpsrf3UIep^<435gqEKqOq%e/9Uc*πU"T\E[,Vd>U3<1JKL>Ln]K#>]$]&1B^7elPf#jW.m8Oh<zXHad9,xI+vGgl>qhL0\πU"_CgF[&ro7[#lWQvo#Kuk-XH;shaxlM?.kLk)\T9HK,BMiD4#Pt=V0;UhR15s/=tπU"&d>fe%lS6K7fwcKa>tnqLfI8pXS-i)FLK8<N;o%].G1r0Q.,DVzaF#-KgyFT\U3πU"+]k'6_2jp17.U]iAI5C5bFaV$NECLA\;pF>=m&L*,22Q;$+?,gB2QgPc/5].:I\πU"t+^l<6*s**YZaZNA</_>7juKJJ[1CffT^Cl;4'mQo=TIjQb(OVK:&^VQq1+cO#uπU">;-)gaR^+FfPw_X9pJ$,/=rCqzT^lGEPGq.a/cg)Q=QQO3=QoaMQq2G3YEW8DHZπU"7)L&SVU:SQp*-m+UR:C:w.]'*QOVO*7rs-I:K6SYEoe)aaJoAuaP(-/EF8Ukv_tπU"C>)I3WU597hO>o8d8gnkg$uF4fDmi;j>:e#msbfS0Q]^6B]dOv;Zg&6J74HMm<QπU"5V5+.C4p%ElO4_[lj]qc>$]e8JII?b^5KPUI2:CTgTQ-[QKA=[UQ8sA^/#M?jv6πU"mYdkS*$K#<6lVN><D6$%L.Uj<Jn:RupDL+FQk_/Z:khD+A[9wp2$nEsA<om2Mp0πU"q)M(qlVc4-'R3WN:<A(+\Lx0>dS1drd5SRt>?.,:MgbVd5p(]6JHQGZ+li8ktQ$πU";CO^xsu*OV->OPbfoj&?tjn[J&uTb<5(tNrCnw>ENZKp*MD^jc9OZ$mDq169%UqπU"R6;-9o%PsS$a<Z^LC-;r(v+Z''nbfpt8rUU^pzKs^L>u7w33QIjed6v&'F#7>SiπU"E(.zb<9HFkk)kznNWteZS&$Z1u(J18UR-(=,Z(Z<RTD;TQL2=nU^*tRog)004&uπU"]CAMG.ZU4\%4kmWKwqkg&YlPY0vKx9ZV>(H/(rW4+WX0.Drfbu7GjjiGDU$znM$πU"^:hW7RJSM6)&+>Lb]S*flfPij[j<X7rA5AF<QKE;?l/tN'n%GMd.;zTcw605PQ$πU"TAqM>yrdWJiS)te^j96b#rT4$vVVJQzn%D68ZKoSQ/S>Rnm8^PG9?oF3mgm^H9FπU"S(TU$6Uq+y*O/2<&[MP]e[]A,hqf]m,B2YavG/o7;Hm?L7Tit8Sie/B.XJ<,J4KπU"mot1X#9<6BLL=(G;W&i%J:^X\73J$mV;BodXL*Np]Z(9TUBUBKE%/=.4ES.E$S.πU"ESn.ESxnNFSTa(&\<+q(>bU>'l(:&'lKi&gf[p$G2+l5n/W;Jo3#VO>0PNO=OoqπU"L75Q'=E+>\jev9Z&R:56nV9;bG4#_kOGswr7cQ5)MK[4HWV%t]4*+04MKE*DWEBπU"E&?6/]%4vRWHH0+[2uF4Y>yp;g?HO<g'PEfX+^Pfa[0F[0G>F*(l8lX-Oyl*gp\πU"(]]oC3QbUa)MBV%etOdzPE/t0qF$'8S];ObEacM8Zl/*-fxpVSJ+u<[#=+F?]79πU"I#hY&+uT7xr5kSOBGwPG9DQ,>k:FeMR;+ZXol%W/IDM:we4ix2Ns?d(XMj/([hRπU":nd96qA)c'hRZ8i2W*\pzTMyhjq==tZj%U:vQ0JD72].RkCX_W_&uQ(g.8J:%N:πU"&g_rD=u5R;kBOx6T;-wk7mMsnV#63qe5ducfTqtK(#FT6#T<[_sh/j%?NiF2#HEπU"W<uK\Ru<TQdEV?ik7z;UL*p[5mAO4*[W.ji59T,<g-Z;hF3Cu_A$x(^kNqrFJZUπU"w(;X*UGK<7eS(aQbPP3b<ltjQ.npV%V.-.?j+Y2YG29cj9M[nDv=L2qWFj16^YGπU"&-9ja1LYGpJ/l'wKLF;UV00c1Xao24UtiGLK$1uP#MaA4KRPgt4\mI\d7P#kDq/πU";&+1i[icvry-2c7ygb5exJpwU;hsoCmb,4JwkrC[>d&qR;MO'fV1;K,-S\2)[djπU"13cn;D(hKnbQM\^uDjP;nhTs4^g82G?Hiu-Nm'n]\wEtPLRZrL?l#1Q=MA8G_2-πU"jG=siO?4cTAXAgiX=./$j6Bn$VA.q_m<=Kb\&,MOG%8E6O[bf/.d%LaK/DM'E5HπU"kcp'sz4T4L#1ZbZnQ_U]a_9=xG?S1KPk?$+5(%MBtfZ-\FMWncfc6Y2gS3?u+j%πU"+nvL1&1BG4avJHHX2Igai2Fbe\Pq*T:M1,'\.&hq7Y)qlanN=ZDX_#)%Mb:QDOwπU".,9VFi[M0C+f4vh8=)'1V1LNa1Y,''veEV8[kFF7Sf*?GLNFkMZ4VvfD_pv(Z69πU"c'o?oxi5plENr_ken*o'^Fwuf*u27=T?3ro)-;?.X&Jbr_%%7j6nOu#Bg8=?LQ-πU"3uKgZk(U'F2PsM,V'Y21e<x?rYNdN/kq\_ROKNvv2bI>]raI'de^Paft04/(Xp0πU"/D:GJc8vnP1-f<NM.+6(opP,8L;lh+YXeSYH;EI4V5WSWCWW?C1u%*6-7c:]]eEπU"j9\pP.8c[L'Z=Bng=VNd4FSMM)r+3T2ONLL4G(F-n[(7sTI^2M>MK%(dA2(?*YCπU"]wLf[08jBay4(?T;3*I#Mnf92c34hncP4^.h<0bPA/9C[aCq9g7D\&D.'uN#OJkπU"(dk32TKrAC+D38i]2wH=?mIq=e<?[(=dhtMrpia869>nc>/J&6.[k]X]%fUl2[KπU";ZX]^PYq*[+uLV;b=i/<FR>lw[_ihAvYw%<A,Xx,S=HvI;\.dsV(zA?J^Nla'g^πU"GA3sr+)6B24oqf=N_rUh-_Bi,_.E$6Q2G'G'2b)^7pkT9Ijc#6mkW)$O;6W\[alπU".68-%AY??&XpkFr>'1e_ehiW_Gw<n3\(H$Q024tU;r\IDuh1fMiYTDYYBqp1=FeπU"ZjF64vU_]cKxDq+oV<pk<3Nkllv#yn3,:o4,h7#$DjD$VSgE1;u?;*CFhG&0i-_πU"]a0+LB;>V*^Z\?anP8])<36bM8C;g5/(a,;dd3[6Oq_<YBLMCRD[sOcKa-^XmV+πU"[.m<2;NPdtI.-^;?7B:T84EjUIPF#4\CnT==6rO;P7ih,e\l7fE2#bCCM]Wxg5#πU"D(7UKJ;yaTtV(Of?XdVS&oAc,WuodqA;ko28/:\[0M(F;eMV%Rjt81DspIN2_'yπU"\axm-JVz:xNJ9OfM4b>&49Dc?k,%=%N.x;W'BvP9laWzd.Anoe-YbY=F?xVXJM+πU"kx>UmQ(1;>6t9\)pyHIlLGdH^ydSfDXbdu[FMgv7,H'pLvAkAmImA[W3#:kyDe=πU"?fW-kGoyturv?o5&s\vCZ+n)aANh,Nh\8z8t'W'FiW-D#(x*a;KbE+9)<[Fp#UZπU"0MdS$A1J]A9o<8ZtIX?IGRda7xcO92>]M7U2k9qtT'^>xSsJ\IIZ00Mjg>Tm#I&πU"tviI2M<-N*.2M$CdpL;pvd5O26M;F<giwZ^?5DDmt.3((tX8inAxKH*oS./8Ww'πU"c><LN5AbRI).'>vUY4Uae.B,/?T$U;sQ>r2:zAZRjA6>:tZ6?VD-rvR&fM1yX=:πU"t;CXepU=sLKbo3]61tS*iJ$C5MPMezI,cJ4>ImNZLGjWIO$oXgPPXN)^D*f95o/πU"f.Dh6m>si1=<Ndkj(hBEPj.l.2u1+W*w:CHa>WbAg/r[OG?Yh<1-6MGf1S;eSMfπU"g,]66g)7-B'8aej_QnUG7YJ:<Qu)d#WPlmrAP8/g0sM,v_A\+GfqRhtW?gQtO.AπU"rKfK,Zz11unJddnpV^H/2sQB-7:ieYK[NJP=o;GimmY_7QCn?3mgQ\uBB6&J0T2πU"DKpwpg?NTqZWX:m6wkD:nM4(jM&45.h(Fw*EPz5P6X<-:D)&mqlv7LB_D>*o+\&πU"kxi>T1btgBOu%]9xc?ihVell^,lDt8?je_K)X=Hxl_T$^fk$0pgthQNzjlwYVcEπU"lY1+ovxxvVp)\mZ':4b'0q?N2?=;8TM+;3:OvP?[y?Z=2o/$7ATKcI0Jawf'l%fπU"BS+UZnqn&A2obJ\prXlQsr5f*'XslN,*ld>C/z)VYn1HfG?*PLZ>KX7[bKaWopZπU"HUYNd&XBb:WH%/PC0T0o?W8AGjC.t6iJqBHW(5%&[G(:c-b'Xk-o8X+iMEp?I*nπU"V_e0m/ii5%mF_ktq:/P*#?AYg8b?JUq4,ZF[.SsH0%[,,+]\Pmof;1dt$R=Ub/9πU"st9*wIl1=g#[f.]q=O^(0LOIFjH9(a+(]S0VGIGy.L49/P9Spd\z.0MrSDpL\e/πU"plfyP_g/S;*F??g-eZ32xh/]e/n^(<m#&ZeXZ8U$+fpsRz:,]Ycdn6qEU+mmmS<πU"YgB(qZDC4adN?pnWqY*Zr^9rH^.Jt_+_+eCX4lZIS?W\;xAVL2F4ZgnqfU1zXV6πU"U[FKe\]*jR,8_8cQ>U%7n=WUYT.3JvDY$,C)nm37QzM-o<L3gN?:2\3'G]S?3qSπU"tbTu'im4;03)ESzkch%DmJ$I'L9Cm\0+P6s?9KN1DAiS$a90'b*Ss--UV[=Kn82πU"f)b?Dr7BjdIf3uaQmSpG+jpl^0R(^2+r#:#w/4_mIhA])6dFpQ9BpX:fVl.bq2MπU"CXHlo%B(jWbrA4R;v_)X:JLd*sWw*LL-Q)B7%If3qMv%oR01\p<;lI,4)lR\?H>πU"e\42N*n_U(F2K4FY*spxE(L(VlN.J]QVC57<sIkOCVwVAdDsd3\cn,vDHvDa<ViπU"NRvNu3^n*$mSwG'vYpJKt8B;kpbzIJ/q(mxj=plnY,Db$*Uj'vS1I_[V0\fw.T6πU"4nFVq'&<tguB-KbP1'dp+bS07P%oiw7I\nT$GZ$t%*X7B)J$3Ca_3WkL+5aj$D(πU"i2)3e5:[gYgDD;7>H%AJK#>2<8futjT2=t2mfS\^Q]O1ws5fKZZYm):6$[=:lYQπU"FPP[-I[8.,B$nL(n]pTk>x(.$fv\Z\oTboX&V\s?du\)[J:kBT)RNM.c7m41HAgπU"AiFoR[+Q92-$T54Dttxv5ZulPAHbHE=bvxa;il^(Vh2R/vgLPewu8&An*pAnXh1πU"Zvq%xe;28W'F.6*,quFO)zVq*ljLdQ.8sV6KU;le<d$fW/.;2$iSV+dwMu^Q4dmπU"?qdvk#(;DN;aGc<$9$=DcE\Pm15O%dEmIGHZu0^DcD0d<R8Xv8W[fI)[e0.>IUVπU"&z9nZTAjvAlqFW[pufCJ.?'Qg\A5p^ig2I(:]W>xbv(<Qj8o5BV\P*MH0o;0FAnπU"qKh?,Qhvtg>1:lgu)j&1Sr%S'.'<Z,Px(u%p&'9%%9%'[%-%\\OaBD/\6J0[)%%πU"*%-%%.%%%%%%%%%&%%E%%%%%%%%%nsy%wtSy&'yup%&'9%%9%'%I-%/TmaBT./UπU"Oy=R%%u.%%%1%%%%%%%%%&%%E%%%%W)%%%vgfx%lihV%SUUV%up&'%9%9%%'%-%πU"*?XaB/&365&.C%%*nd%%%1%%%%%%%%%&%E%%%%+B%%%vg%fxli%hVSU%UWup%*+πU"%%%%%(%.(%z%.%%^$%%%%%πEND SUBπV2πCLOSE:IF S=206AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπSteven Anthony Morisi GAME OF NIM steve179@ix.netcom.com 10/96 (00:00) QB, QBasic, PDS 102 3170 NIM.BAS DECLARE SUB tokens ()πDECLARE SUB cputakes ()π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'Date : 10/96 'π'Author : Steven A. Morisi 'π'E-Mail : steve179@ix.netcom.com 'π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'Overview 'π'The game of NIM is played between 2 players 'π'There are 15 counters to start. On a turn a player must take either 'π'1,2 or 3 counters. The player who takes the last counter loses. 'π'(there are variations where Taking the last counter wins). 'π'This program does NOT use perfect play ( since it was written to ' π'amuse my kids!) You can find the logic in several books. Try 'π'Martin Gardners Scientific American Compilations 'π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''πSCREEN 9 ' 640 x 350πDIM SHARED remaining%πCOLOR 7, 1ππ'Start of game .... 15 tokensπremaining% = 15πdone$ = "NO"πtokensπCOLOR 7, 1ππDO UNTIL done$ = "YES"π move$ = "NG"π DO UNTIL move$ = "OK"π LOCATE 18, 23: PRINT "How many will you remove "π LOCATE 18, 55: INPUT number%π IF number% = 1 OR number% = 2 OR number% = 3 THENπ move$ = "OK"π ELSEπ BEEPπ END IFπ LOOPπ remaining% = remaining% - number%π tokensπ IF remaining% = 1 THENπ tokensπ LOCATE 22, 30: PRINT "You win !"π done$ = "YES"π END IFπ cputakes 'what it says!π IF remaining% = 1 THENπ LOCATE 22, 30: PRINT "I win !"π ''''' FOR i% = 1 TO 10: SOUND 600 + (10 * i%), 1: NEXT i%π done$ = "YES"π END IFπLOOPπSLEEPπSYSTEMππSUB cputakesπ'Very rudimentary logic to give it the impression that it is thinkingπtake% = 1πIF remaining% = 3 THEN take% = 2πIF remaining% = 2 THEN take% = 1πIF remaining% = 10 THEN take% = 3πIF remaining% = 7 THEN take% = 1ππFOR cpu% = 1 TO take%π whichone% = remaining% 'which one to disolveπ remaining% = remaining% - 1 'reset number remainingππ z% = 35 + (whichone% * 35)ππ FOR r% = 1 TO 18π CIRCLE (z%, 150), r%, 4π SOUND 400 + (12 * r%), 1π FOR delay% = 1 TO 30000: NEXT delay%π NEXT r%ππNEXT cpu%πEND SUBππSUB tokensπCLSπ'TitleπLOCATE 2, 25: PRINT "██ █ ███████ ██ ██ "πLOCATE 3, 25: PRINT "█ █ █ █ █ █ █ █ "πLOCATE 4, 25: PRINT "█ █ █ █ █ █ █ "πLOCATE 5, 25: PRINT "█ ██ ███████ █ █ "ππππ'Paint the playing areaπFOR i% = 1 TO 4πLINE (40 + i%, 100 + i%)-(600 - i%, 200 - i%), 4, BFπNEXT i%π π'Print the remaining tokensπFOR i% = 1 TO remaining%π x% = 35 + (i% * 35)π CIRCLE (x%, 150), 15, 15: PAINT (x%, 150), 6, 15πNEXT i%πCOLOR 11πLOCATE 20, 16: PRINT " On each turn you opt to remove 1,2 or 3 tokens "πLOCATE 21, 16: PRINT " The player who is forced to take the last one loses "ππEND SUBπMatt Zuchowski LEGEND OF LITH 2 (RPG GAME) liphilli@flemingc.on.ca 10-23-96 (16:02) QB, QBasic, PDS 1767116849 LITH2_11.BASDEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"LITH2_11.ZIP",4^6:Z&=87483:?STRING$(50,177);πU"%up()%9%%%d-%C1J%F1[?Xn,H[%%zp%%%/%%%%if%wfmV%SgfxNNL<Bo[m+grp]πU"axIupJ19e$%<OnYfmPhVo\e;8R*jTYpt/k]#hg24jL#=^e=>^xvv&dIub'C9*r?πU"pRd4#kmt4h444^(p4&Rux%LeirqNt=f-;4$ZKQ$j0*Ni9orwnItSq?+Stv5Ib<nπU"mCr4U>LrQ8G).G[-i$rV_SR1?='BXldQdr&1l(nxTi59n6MLBEL;DDV:cvD=WX7πU"viHU[EoyNBTj,,GRjb3473<XlR>#ME#a,)k5<sV<H.s0fQX$YYsYHCKlb3evJv:πU"'dtNs3ZnsA.<ufWPg?ozQY(zjc]nw6rcNsGu>41bOE77lZ#xu^?jT_jtKNe>Kx_πU"NEl[x,re&9.>Ft'SM9;3GCK]GA15c7?:Uhbb&+^xhOo_S;b>'GMZH/d+^=W_3<GπU"[MpB4_2nbEC(9.3XSZndY.6j'^u+tEsq^NO1$9_%48^Rb]kO1hn[cqNmTj,,GRjπU"bE479iN?clsd(\HjhafIkUw;I]Ms=p-?VmNpY.db:B*zlMtdLqbPG][cQ-MzjW7πU"Ib:K6Es0:UlW):tA'i7>aC=oIddrDM&]mXw]lEJFEiNrx^q3kL.3ijV1ftJ]=+ZπU"WL)&E[u:D_kbJf]mshX1L.dObL$]r>4N/B\QW78n$(5guISO=LS'6F=I[9D:4AEπU"R,B0G+f[Vl+Q,Z:VxclYj*pbkE?uZDt0M>SWH:;LxGu?uRe9><tn]8,,hW>VGDBπU",JOZXTkn?/Kdxyj:]5In*gAo0RuA9GmmRbK?/uwr=2L[,[B].op<PjlA(QB+qVtπU"FFPbT#<cXsP3)$Y]Q#>6DT#V2'Aq7_M5vh2drg%v1X#p\<WN^0#sdn&s;x>Ut22πU"zM?>:tRJ<$M0JuS$ccHu3L=2mr^VN2i)Bb-&Ksa(xk1<.s<9'iN(][L%5[$_EEoπU"1:$ykG5daM-Pp,.5wdNAWaVc<Qo_r-1lhrrhDL4-B>dz^Up(c-NUrry_?+L.C8zπU"S%XHCZ]MktX(RF$P6*FPTA9(OcNW^m+-5dDj/1aFkauY/Xgq-WC4Zq(kz_A+^-NπU"d%TFCqq:%9rcn5g;F*8t-BRlrtCm$$fdJaWrRT-p\J9Usddmt3Mr;9f#V.?1M>uπU"W8'mj7pqq<<mhb[,<D54P+OpVTA^VTVDnRjK^d2x,\5)bBsmk*I87S^q2b)Td7PπU"/'Ks&OSJ>,d)lG*.g:UF)PxI/Ops3Se]\XxGNtex_hrForan]Udiw7qc7ST:BxKπU"Q)0nBQjgPE^S\oG734_WS'aHtl,'(\;S9_K3FA#D]Wm.p3v]N[p56F7=TSVdfutπU"Jbk7N\,ZDWWMTfeua8+B4,-R;p+JF:Md'0tJ2j?I/iganD]n,yK];g7Kx=g]TYUπU"spFtMke?Dmy(qf1gyDW,hVLP3/sx(Ur&dwes6Y&LDKdhG^F\#El2D+C0N[-3:chπU"nIKP(3fP\>XDsOIy27.X4WZ.t=i&e[hK;DWLi##z[T=bqJkK8pEWCX+$3Z.ik-4πU"dPiPKxsp+6'gY&1iR+,l$V)Ddb=b;VGjR7thc/AAAh]%&7d]2x:W[&#lVi3n=/-πU"2=e3w*DqCAu6HEC3xLmiU_crf80id+Tad>zNqVgXlxKg_b;jG$KCGCcumpoTrVjπU"T:k-_r-sBH?%r>d,oIbZ,x=)T$^Lwd(M%FSRuHGEjb&7OX#qvfGtIW#JmC>v72TπU"D?g-u,T3759xVTa+fP8Mv(&%sM?/4kRv-0OJw^7mMBF3TAC$rjTSU&tIBr7OslbπU"w>K%=)s8080Pn];(r)8=?BGUTz8%=G$6ZaZq]%y&eH$:cX/#r[l&0a8x/vUD8*LπU"oU2,RrFru#=IuJg=I+4K?pUmlKH#s9_Q=/kug8C8Bo0IsrM7d_KU_H#=A$>2h$VπU")LvkO4l&jlDD82A%q5bYia]c.3\ic]_uO;F7:M&hD9X(9rd_s_GO[_s'__2e2$AπU"Fe/pAA+#BuNVBM*,c]CFjh,k;7L>tc;yRXX]gl+$7:<;1q'%9Xke+Vk'9(HJeV'πU"l-MkmL%>a1<o7$.)PWfcZcE2AFbe$pwDd)6)bHa.'9x80gVom'gbYJ9-y:Q'Jb_πU"2=eJk'm$fpanqkLOa7rG.-In%j6c6*\#vCRJE)gCx8.S%Fhfm<I;JfOA<).-IFaπU"Iz).7C7FmR.hMUiH];hJoz-K5ag<V^mf2FeJbQ^sGYpIET^eO<QJ^Se<QJ)^kl4πU"9eb<<'a)l0Iu1.O,1?-MXw8c/i87\obc0w469=Uv:;*K/>/32z9QpkwhR?dM\R_πU")#tDKGMUF[]7(&YAi%BaLXN</67T7a)((Y.C+up]%MS0bLzJz3mo4sK9YI%j9-CπU"(;hR]G;eP:#s'\G/VY7MxQ,ul2(reXngd/n6=g:J^VKhqwA>oTEu.t#0M_4XrLCπU";>batJB##Kz9?YL^_g8]a,+Gyu%_LYBL.l*i]C^I$fF1Za6uC+/MCmE181mVZPfπU":_]YsFQ9-A]rMD9jA[)X'B5R\8vQ*9hm?aiGi^^ECK;a,*XRd'-mBRaemCd;(HLπU"2_XsfBoqI\nYs#.[EzK'(*xWVIDmdX/MfyqTm0k1/1c_<j8FP5&g]2<#bBvOr57πU"X^>P5a=0?(HVTj5AZ,X&e0Ah]2s#ol)DA_O8,/OyhmO*-_XSIeo['0)nU07C\SBπU"fRf-G[(,H9JcN1Ze3m9mYV-P7VV-1Rq1fDRq1fDRq1fDRq1fDRq1fDRq1\DgeW[πU"PR&9\D4%>GB.eV-,:u[P&49\D%*>GBe(V-,u,[P&9*\De^+>((MH?d%YKj_O105πU"3o=]((M?fd%Yjg_O15[3Qy?fd%Yjg_O15^3o=(m(M?d:%Yj_;O1538o=((XM?dOπU";82538o=((=M?d%GYj_O,153=>,?d%GYj_OJqRu$ZArm9mYV-P7VV-1Rq1fDRq1πU"fDRq1fDRq1fDRq1fDRq1\DgeW[PR&9\D4%>GB.eV-,:u[P&49\D%*>GBe(V-,u,πU"[P&9*\De^+>((MH?d%YKj_O1053o=]((M?fd%Yjg_O15[3Qy?fd%Yjg_O15^3o=πU"(m(M?d:%Yj_;O1538o=((XM?dO;82538o=((=M?d%GYj_O,153=>,?d%GYj_OeqπU"Ru*OjSv&hrXp6M]Xp4h/17(h217(h217(h217(h217(_21=(d(g35^3o=(m(M?dπU":%Yj_;O1538o=((=M?d%GYj_OG153oa=((C*BGBe(V-,u,[P&9$\D%>&GBeVA-,πU"u[]P&9\2D/pWA-,u[]P&9\SD%>G#BeV-d,u[PR&9\D4%>GB.eV-,Rq#\D4%>GB.πU"eV-,:u[P&j9\D90aW-,:u[P&TMNOfWmX[NBH'8bDCh=ZI'8bC/h=Z'L8bCh(=Z'πU"82bCh=AZ'8fDCP5<d/q;K.*Mj'18jC&rCu9=gK,O+7NU*n1<o;/:q;K*EC8x/)1πU"bSefR9gQ&s0u[[*K[bC'crPSXr3/GpS9g*Qs0u%[*K[0b'cr_PXr3C%4x/)1bSeπU"fR9gQ&s0u[[*K[bC'crPnXr39HaS9g*Qs0u%;*KK'bWV;:*u7j_PXn3Cq[jP8XnπU"3qJ[jPXFn3q[1rPXr03%4x2/1bSFeR9g*Qs0u%[*K[0b'cr_PXr3C%4x/)1bSefπU"R9gQ&s0u[[*K[bC'crP8Xr3%J4x/1\bSeRU9gQs%0u[*7K[b'JcrPXFr3%4Lx/1πU"b.SU<[[*K[bC'crP8Xr3%J4x/1\bSeRL9ggr5Q_mLqBgG=J'9gg$<CK?>q9=A&uπU"XV;7*K_U;lX*MgU#Vb(eW[*+KoUB)o;/q*e0_efR9gQi<CO+RNU*V0b%4x_/14LπU";PAS9YgQ<C,O+NU<*Vb%J4x/1a4L&C>u9=CMuRT91x/14TL&CuH9=CuC(crP&XbπU"q,(Mj'8)Jg3u[[*KoIUBo;R/qe07_eR9YgQ<C2/C</4qe0_Ce(9g5g<CKr?q9=(πU"AuXV[;*K_gUlX*#MUVV0bq[j)PX$q7,g-NjU*VbC%4x/814L&rCu9M].OU*GVb%πU"41x/14TL&CuH9=CuC(crP&Xbq,(Mj'8)Jg3u[[*KoIUBo;R/qe07_eR9YgQ<C,OπU"+NU<*Vb%J4x/1a4L&C>u9=CSu(L51x/14TL&CuH9=CuC(crP&Xbq,(Mj'xBPQUDπU"t=W(7,wahUWsat-)aIzI1x_LROw(L#;8M(t'kBX>Q*'rXk0:7NOf$5DHVc2k-U4πU"sPWx=QCNkSLYc)H6gO1lsIH?4saeqR(AH8dIxQR+lf_6pt*WI6#%([iFjP9A$9FπU"ZDk2=5g3j];SPxSpf12'Ek_\FprxS5<^>sf,NN\>,2uNU;'rbPr*00Xu;;_21PlπU"\)/pq0V\F&uP:Ex&ueMTBJkwSFr*uOHNba(BeUNUQ[>Kl3/kNY9R$x]i>1M<A_8πU"MY_pm*_Q-3nGh<nlEGgjgl>d2k95^#i_RSv_V;>uaJ1=N;u/$T%LD:;H0vq3p*VπU"pqh?R8v-,X\47S.isLY)Ef;uu&I^#9?ZVHk>hNhC^:(]+ql\+*Tr9Zl9(#KgOQ$πU"\1DP^M[=sD&D^jGPd^,PppT1mqG1L%[G?5tRUQO6xFEaZMU;E1ZM?;4iqY4o3JXπU"wem3+Llk6<W=WE77TlcLyveBGR,f$QSr;cK>.oF-VLGhGveqd2TggfUvSrhVQO2πU"S_?nGEb**7;m#TV^[QwQe[aSTpdxs\Aib9KgG:89[GF)9K63TDv0>OvJVj*soJ>πU"1c&9RUB)g$Nt'c(du2bDBC=\eHOEX(R&4MC&91otYbfr_w=AE'hHahXDB-Ai:GBπU"PEqlX]&\5E69WG,PUOv(Q+.W/4h/\%J8K;FFZ/Z,_4A>K:Q</?88rg_pi%gQig4πU"/]7f8tVjV\9wmmK/UN,oX<p<\Q4b_'h]lUG=o:K7K$n^4P%1VaXRf\jiQ6pWpMPπU"*),V6AKlReFQ?w4mK*j5\X/H.nK;HcEV=cXFF=^e]VX5?W*W2LNn8a9m4W4qphQπU"Oqia=/_*x5E/=U2iZ/he5$#SKvMr6[381LtIXYbhlej4/wbWv&#kE$S-:izrHsnπU"h7wb1hnsIYp*(TSg>bjIvRpJaB1nQ9ZF&4ofZtj8T9vDPLNZlOsC0'TkXI'*DaPπU"pS$w4uuGBO$'dOsaU2FF+78[ptYF1\pgbWv2M(8Y.hX0#QFeum3XDXRU*fXx0rSπU"V__Ki.TnyAeMlI=E7#x(K0LmF:hi*2]g^w6Aqhli,fY2KV=[$4I*P,e9=-+?mKZπU"/UNCtX-L^>Bmh7-EsY8,jF6bB7crioX,TO+6.otEp_q;^$2i;Qak(HV8X>v)X<<πU"P\eqd?p?C0/',w?4WKs0Ypa?(R#J7df*HavalX-v3JiVaXffsJY\)Fnh_5%mK6/πU",1RO_UPCnXyH^H,]D_+/rYpp$x$Its80&XPVlvY(S>m-xIJ7^dfrup_bHlP/w99πU"g,$s1RJZje/LrkKS<$DcQo(5h^I<$D0?=EziRp(S894,*+[PH7F/(IVHTF/UNqSπU"511L:eKQ6Vi</<>N2/8KEw5hlW9-;TnS0/fKnjX*jrRHnh1ZwC+iXFVfeDhhllPπU"8_zvHTcE5q5C04eh:amdSa0rW%_V=[$PiKNY(65QTSH+#^I8*Nf&P4lhLsrm^OjπU"72*^>maX*#D#lIGm>Dn-Qj)i8KW/(T=(yrtX-*N.8(u\FrHS/g2/[4B]\^mi5BVπU"y_8TKd_B1Tz(FbhQnVn[K6VYm76j*aIi/lZfuKpnbwW>d++tQlm8e-/sY?c_YYbπU"QVP3wT&U_SSXl]?rWU$#,&,n76Tr-;;KY't5F4j:plaw:.zY^mTgadb6\4YhdmKπU";\e_W6LnvnTGen>dYNu$sF-7dzc_NDG2bzl>mX+\l8TK$0n]]n/_Ss&Fa-&vQ0^πU"BUYb$&%HgPAMXC3'-aJPfRHnsKoVpQmb=FHlRra?mGfE8Mc3s=9ScJ>6D0b:d/hπU"U_LiJTf,Ft$:,7K$6Rvvn]x=$A2L9imlNd*g)HgQ>Vp<2&qrhQB#3-rIlp.OKNeπU"i51OLRDlp-5dXPp+2]9(*lljW*jrdHnNhorPV^qv(SBe;[wHtRTO-,F.pqjX*bRπU"esnNpovm3T+RpH#miWKYYB.kBm,Y*hpCrIVP=.6T^c]K6)bB,2LG\7;ZpRV>&'BπU"I82*4/=PHIsFU7HIs?8p2(in<&33XeNScswjUWdnF-YK*XMs1g^7VB?i-5Ka+\;πU"*qk^f?C]hgLd9s#HNP[6_uEEWol\y.]cw/EvsO=cswEXSl7(<GFl<62,>vLidIBπU"fqJBPnqEA-'=\H7\h>,>#t:?O*kf]C6XIPF*i#-aL<nam?WdI,e<]C6IlddC+k4πU"(b\Y>PBef6s]8e,L*oR_^wEkl-f]bC6IP<cs6IbvdJ28%LfJ^^,TBAD_^;8)pkJπU"S'PBD\2#[&aJr7%td]s*8(pkJn'PB?>i*n+$oz$scoNb)t.VJ0l(gPvWc]7LGDTπU"pAN3-a:>&06IbvdJ2;EDTpPA3-a$d%eDhMD^8qLD0et&pqTV&FDMVD^8L&D4wnrπU"_=1?q\Bn<,Pwqcu7cT<<DE#<cfgDwnvbjTddjtkS-1v=[pb$4Y;/4qpG6GZE$/vπU"H*tuL<dv]fvrJ+CRYJkToZ4D(djzJDP7Ff7&$k8uXj%n8I'I%2n\_0a2II-Gq+fπU"982C'mm_.,aHI1-Gqf'982'&mmuB2GybE*YX+&#tY-G[Gf2YYXwC2*YX+&#tY-GπU"[Gfl9s8r^O+l9821'm75KiiQ]8PLk02s^PL[?)aJ4EYX)\l%t].<vn%#tY-G8qfπU"98#._*m-A(.d1*m75KiiROdL7s7F6EYiIZ?U5hbPpZ23/7_V8':oWLE1/]K>=k6πU"?9_\g?UUVRFr&R2ulRFA>11Hhr07Y=BK]_,7[^=Zk?9_I\?UU]WFr(MRumR(F>1πU"1MHr079iBK):$7k^s=k?9A_\?U,UXFrN*Run/RF>1L1Hr0]a%AK7I$a'm]=k?*9πU"_\?;U]9Fjr,R'DORF>I11Hr,0a5A0Sirp<Y/A#7(hWmhgZM:RJr-ZMMPR0?iC9UπU"hKt0a^<+_msk89:A_\+U?5J)go9t#bMT_nP(F>11MHr07;J,K1337J^s=k?9A_\πU"?Uc/PJFVoZ/f/RF>1L1Hr0h7J,KO137Jm^=k?*9_\?>U/PJiFoZ/DfRF>I11HrDπU"07+,TK137:+,SGSp>]/#])+U*5$U4EFol)7I4FEO,<Kh;P0?qH<I1InsjkI^1AUπU"]D\PF>sY%)#(e>29&E>==Zk?9_I\?U5BIHRaMV5_R(F>11MHr077+bKG)H7+^s=πU"k?9A_\?UV5_r4.RYRAL1H2/'A#2hXXAum(<if3,U5VUN]\U0X-CuY1=UoAL1H2/πU"'A#2hTTpxEVhV/f/RF>1L1H2M7U2p).nX'lZTD:?h._PZ'GE2h$T*LF//B<T7,hπU"W=a=kk<IU)4M%B3hu:3U5VOU]\UMp./M8b3v'7,hW=a=kk<rIUI8)S&l#6;:_\:πU"+U5VOd8VJHJm;AJ0\iP*ZMY(0<B8?kUo\rTNd->IA1H2,/A#2=htOE[rr(f[#,hπU"WR==kEJ9AXJqKiD>Yql3gO)3]Dp[d:5dZ.uZ>Lg03mznODuxOZft(,hh3fFRlW2πU"FizXu.+VjEs&uCd[VdGKL87D)()b$*WY5iqvj/l'FAUch3?Pu27O$$U;O*e9a*OπU"8hX7tt$h<<ahJ;\HBquWXtZ,G(1-jURCPrhghE:QKmvY/.Fw00jRfgA0YFWe5)'πU"Rr:dVZ<$j(s<-RvgiMpGc#9D4(^D84r,A;?*.4K,JV;Xy[Zc_pFqmOjmiW5g71dπU"x4jWYTl4Xk[]'.qkZb]UsyZ*KHvu.Wb&O7fN_>#aEfJGO_vMEQFH5yuGvBm;zkxπU"F_.N78m.\J^_;i8cdJ8</Nxv?w$o:PTh[u''DdYweS/S>3%K'V4o<ljk%U>b9YvπU")1%hQvv1R4bjnHN]n$J\^8i?CpeF2k[3w<i5NFkl6LxcY(nmY^vGPfKQ2VUJ3M+πU"qEanVug?\XiD3p>H2;y321(al1*#wdCHnzNMh-w:68TY.1wSv:*J[D?OX$5%M;?πU"lL76w+$Z67j>';P[sY^7'=esW+CFYvwB]TnC%B_kQs2K+Wv^UL9:P;5EaDn3UabπU"FHxj^WXC;o$mHlE[8Wn^iVnL7WcVr$Rkp&)\Z,^]vO<[e=WlCZ*g4k*F?_;BC?RπU"cgRJ$L)xI2i19Kmo_BS*LqxW#IHjlGIN&YJD\9giZSr9Z;,lbyW5/x?*'1;PE?LπU"x:f9ijc&Tv#'OSwwM'G^O)FUNR]GXrK\TJ[Scg=d=\p(20T1mDZj4c$bYH-qkfJπU")H.=+C11ZS]N%[*DTB>[[Ci97=)ljg1PJqhWd;Z;7A(8IJ5uza,m6hF_iZZsT0-πU"<h<K%^+Pr$HK.b4n:L^[%Yfs<^d5z%Ye8Kz;;+0.e<OGw&,ld3NgO4'>MY-rF1)πU"obXwf80F6A**N6g8$ne'eYw$_a^sKRc\Nz643PumROu%MuC+a,]4VBV^s\<^qvsπU"KDx>qvjfK8QlLR7/4oPS33G507RCq^lW+I&H6q-ErnWnE+<1jE<.*h88&v>[F9(πU"x00eHNRb23EN8_y;GL/zQEp-eLoMm#4/k\zuBuNmzwWbVqg%Npbi$&T;tzS[h6kπU"A.K04FpO=O<$TkZbaC]OajJpQhNY&j[4V8xeTrj,3>ZkP=VW+sM2TxKuCToT&TAπU"L':S(XPX5^d23c)_VNf)]A.\C>lfWjE,0jAFF)Q3G7p^&PESU7wl8cxVKVIgAHjπU"sxCLTD#>b6sxZmOsN3K4K(N<iRm$;0ux+*)Nx0bMSs<A:,v$]lH#<8HV65dGFhWπU"LNCp^1W)h/55/nv?a==B((Oa8[g)MTWfCi6,A$4uYTLFkuKYF(MmGxtk0buZgW&πU"R$Tou#&Zk*jLo#E<6uS>#>i[8BIGP4)G]*X\9bM+CS,&Z,d;iZl)[X*pB]%KFV-πU"N$rVuFGYIL\_(Idf(O#I1HEcci_&bxoq96+SjdDEaSTS0T\76e&:f$wCgb/'d1BπU"Mq]Yp/7V42H<C[8f+:*bRjriw;N(fy13Bfx5m<>n38A1U\l]_LvrS'68sX>uWMeπU".jFWlW:)T.<cxqIijoo>o^c>5T[=W7x+lJF1#VX-><is<#VXUahClEMXW<DhFgCπU"NiP,t=L70,SKJwuTIeL=.5[Xe\1Nq%YtZ*UkH_OYZt#Vk_0OYZV?Wk_;jY8DZZvπU"t=O;j?&r>NFA]JA7q1PaE]sgCrCQn$o:N4?MruTtDZl5M852[?P;?N6b0BGED*NπU"2'=mWNTgQ\YcHr.*0..$XG_$>Pd^Mv)JCy:5]dwR]Hmc'/EaFR$J%=GX$ZaZCA>πU"B1.q;1A#xvCBAyNBa)#Lv+(\ITc:5.]KD-e2gh%:se8biDt#HR,]WC3g'9xSc^MπU"vw),%dnOz$)_uU5/%FSp;b*E02O%gOnue;\5K#I_PG1gdLHd%Pd$*F$ZKI>I<NnπU"a(/S=r1hd09Zl&;U*D6^/jy3ukAZvUjeTvq^tbaiik?lH*\l2JPe\\K.J+:FZZ^πU"W&\ZcF^1i+WQR%mrh$Ws(hwds7r0Xk)Z7cmu9EfM;c;atM[lCGio#.Dk:)<tqCrπU"n#<([.JKo<.o\Knug%RB%?*XVMd$mbft5E-b;_IrX%VV3^[(a=IbLnqKd,.t.W)πU"(=\gQ'UD''R\Zd'iJl6d-+s=S,(*:CWc/nqtOCh=WD.\V=FT>gr*Y,X3&P+]VbtπU"gmoeTb^CWY.X=;tDul:QW71I'(Os3K=TqAL=bxWrlg&dETPWnQF7GfV5$<-U$5YπU"l[xrwLeyo7(;=aPprnyxbR$<hy/qdWT>)$jdrx2u//H6.ZtJj8GVnlqNb&w:>P&πU"jbzVZn)R6M\%XSNxFh2$gI]jBDh3W?EV3OQ6/sq-iLBcvevG5qqI><c&>uR+tsqπU"^^N1$*j:7X9fF*Pe4Bk6?m;FSQ5eqm&,Y/r2Dg*r4'L97gp%biE(ii;oQERCN%uπU"*$$NCP*Di=*%HL&a;iN$.^(YM_C%^HJRlncu(k-s)x#NNw-6pvCK&<:pN_U%P.ZπU"1I:''%8$Lr;sc)#E[Y5APs_dK.2Su&r/hw$E1oXEP^S\&?U4C^/pzU0vtj+X*bkπU"MX.-Dom]ofJM'Fh)5r^1tLcsKlG_eOEkftHDffaLtue+00MNA/c5O[6B4^4^CQ[πU"$vX:N*7dLNQM*,5EpyMI$=]*bkiRFvnI>8K7QfYUBh^B6t*pk$8YwXrlE.A#4jvπU"M[$g*kdBF.H/^l%QYef[#Xh3]Yf;v^Hf:wK#.)N5I(o-NnXFAGpwG]QjtKp)PRGπU"VohhM,C9b82KiS,.=ZedHbWxLXz/lyTx&zDyjB&OckT$YFz>Y]<1mprt<oxIG'lπU"('iV8%d8oV1)GXJPyJN7GC#eUznm-PlbB^d/RIcQlb(Zi2M2-m]S-1JLw>MU<&ZπU"&sNg;2Yy(^*Jk;)k7$VufLsn/LJ3pz%k;ZuT30zlnDrTx;BZN:H=-_:M;aBjM,6πU"Hk060QqCT0u:PcoDj'/Y#5noa9E$<ZZ+hXOYNuKeJkNON0-rR,^sqPqTTc.O)jbπU"Fdcaq>)a.5MY\QvCjYzt6B>7Cpsvs?fS=&N?X<4$63+<Y:RkEn?Ffezm2yF+nG1πU"$RrZkF<h2%uFBbG9U5CM$RmB&'V*5lpR;LLWjQF0a\Yc,<N5nJLo/a0$KL?X)YoπU"inh-K(>,sErZK^T+O]&%^8T4#ObvRM,&UM2arg\l6:rG)NTot^<0zu-plGO3PgVπU"n/AQ3Q:<b2AtZ4$RdmVz][yR4WjH>-OGMj9[GsqA3r>ikS&f^BvFM_wdrHbr)\gπU"30T2iLdkR9iHZtaa_f2jmNJlosR_qoLooP\W#PX1u3f3Ua2:dVAZ:r.?Lj&sHqDπU"1TVh2gYD$gDxEQ,Hx\ERi7Lruk4Uj[CeNt-KqFk^3^K$#'XvzAl><BMeTx:=K<$πU"]Vnf(=\2>7OW6S.r=;o=^6Nnyw:VSeI#2$S)OU?o%GBfI+kCIOaunmU[N%s>kasπU"TZ=Lqul]=/B8%aG<Dn%)kS<tNT=UfH3Sfyo>M0'Tv3>[4O0lO%mh$?SY#NR_BqVπU"ST.5ewZtG*U_7.gk'\CZWnU7bM]d*og7vb\M8$t6vc]Abk(We7.*N^-g,=?xGbrπU"sVH6LJYL%gm.tA\:tc/c7m?(Pm-V#JaZ%Lapk=_i9JeE4)Vag:Ik4$hGLEp(DX&πU"7<D1lDvtt]\At/D$%/;skfFmXMQCDdOcdS(-^IOz-GTYZ]KQ[er'1<e,p01AsZBπU"U<kI74^1QKK/U;ZpThg<X165:VPKS[D6('*eCI#b-hdbCfn;G4I^=VaqD#rgL4kπU"Su^h1Us+7T3UbkteJ2AAbnYJUnvl60#EsCilc/?f.Y&-m7<ol?2l,3RLy)z\E6fπU"V,/t_zL[L&<QBA8_rek-St&BVo6\7rATEv&%'Ds?LP?6VtLwx1TQn3&Y2(M]E<0πU"t'4GU6<R,/jJp_RXXLLpeA6rYr9rGNi20p^'c_HlX7epc,foF0ZtR_vTA8^x8mtπU"lChtVA.LC-$UE,fTG/mZX]m=>C^wvZ3DU_#kpX:ouv%XmbeCCnW=/lt.YQSpS/]πU"Z=%Ow]Q-w8Lwd5CzIEg5/,90zaH^0TcVT&g4E1/lL6?Vx#/5\;t9Si6guaG.wa#πU"DFw-,px,u%p()9%%%%-X%n/%#F14X*lO%%+%6%%%%-%%%%rfy%ySxf8%XKV-+IVπU"+Da5EUhXP]*h]h]*^V_WM+VKV*<kH21AD1e_8fpB\**sin+lBLX+L,I(BA%G2)RπU"/E>2k$.yJq5+m_.c']X^$]fJ3MStC;R9VQ$$vsB_N)6V3u_s#M&2P*aRGQ<uoM9πU"YT)EaK=ACXkc=q=#1hJW8:eg&%%up(%)9%%#%-%=_MVE<ubmiX%%%%$%+%%,%%%πU"%q%yVSiRlnNc9V2;U(1SHdT)&&17X+<UUoUYP(Rh'.ixac/eWE_CStiFv#_^s%5πU"=PBoH#VJl-K1V2YjPw6)Qhm*SVO<OOW2_V(8a7JLMSQo?A7*B7N-J?+FCGTF[&^πU";/<'iNu0r)AiN'<CS5fM5PkYSwem?uWdF^S*M4.yiAziPdT3NQ29xEEzkVj\Kh(πU"UB+Y_lPar0kT]4Z^75^d:gY3<k.Iknta#;un6ZV9*IskJBrh4m.c+2c[h.Cx(<-πU"0DE/I)^[j24(xKSnA,Q4Q8b+mq=X$nba?dM%Bup(%)9%%[%-%;)MVE1O4Mkr%%%πU"%P%)%%,%%%%q%yWSiRln>a9D2;eI1iLoX)kjmCNYH4f1-9S2Rjp/pI55*%[,G&XπU"w;T\pb]]JXiCl#O<2k=MAd86B?(>Ec_5fV?K.kjh,CviNiqgi,8*>zd:h7N^^O+πU"/.'PK'XqU\aDt=8C31$un?s6jQcbD=VKD;.)rjE(mKvK6K)9GiW7p4tYGj/a;thπU"#T3KLPiz]4;,c%P+A[hQiac6$x0ab_bt5%%up(%)9%%%%-%0_NVE4K7^>8[%%%DπU"%'%%,%%%%q%yXSiRln&$0V2OEC1S#&15]DAi<pkcB[Ss021*z4cw=iqFEUhB7RAπU"dW>XEVE_rcoI_W+ns+nx'(2Nsm)h'g8,Oyl(6=):vC/FDpZ)+L-Dr-v/OHve,LTπU"'j]IEMbRRmFDh%?F0Nd5f?;u%p()9%%%%-I%UYVIE/9d-1m%%%%$+%%%,%%%%wyπU"V%Siln<NbF6AQU5TShbQP4URt15Z*cRN;R,)8TXgT.V']]4Ci4.$]bIHj\ZM4YCπU"Vb?ufGV)sXn4Pq#b12OzAI(e>\$pc&A)E(H^wg.ejO%BwMg8.fmMHD%Qo3Ay6>qπEND SUBπSUB V2πU"(8W:N+.J?FgOygeqQhcT^)r.IprTFB,qE30&9o<pJ1[BVdEiDP+Yn.NaNEJPgaVπU",pF1NS(/hf*9H5uDsc2cUXRV_D?ds;Awk(kmlPBkeAUC_QzjFi4G_>aTT>a#)pIπU"UB\I^Qw^649J>m+Z8F(,+)-6hy2e*=[v7uOpT+Lu(>W,7dy618RR9*12Nw,%up(πU")%9%%%I-%RY/VE/\1=Sr%%%%P)%%%,%%%%wy%WSil4n>$p+3;U1=i,Y-QIO-BCMπU"eA2j3:h5*i4]*L7mK7M_'sZ)evO>>zkLm&HbDNS,tpC=plGqU,ARh9lUo^_G*idπU"%uzCu%x()UE>15$d=IA=%J8^e;VA(7O8qb:CRfNA3/$anQlv?9ul?7%%SyTziu%πU"&lY=bBiN>$jp7^USrdoD-&M^fDv^P.SgJqCWFTMLe1sCs$v.?kg3G3w8>%up()%πU"9%%%R-%CYAVE(A128=%7%%D'%%%,%%%%wy%XSiljn&$D(.OU5CiRR7OKf'U(j(xπU"3PR6'T*Y38*.dEgaQ;g0gNv4*6N$e=CJb0doj67aZOLvd74F?m*/*w$%%(bxT;4πU"NcQhV/m\fbHsZ9ghjfdZz)hfV4)XSCGDVl'JBEri:HSut/s$*IgBu%p()9%%%%-πU"I%>[V:E,t7(%E'%+%,:%%%,%%(%&fV%SilnWf&f\'TU1rKX3fR7N4Ov[Yilbq-,πU"Zw:9wqrBRn3TMR:Pge]A$[nrBlVtbhp(pDfDHi0^>XjThv6)s,t$ufhffqn*0ZfπU"$,HTL)TE\Qhdg&jv[CDr$Y<-T+Ae'pBlD);kiu)Y*P.2k[m%m-?lK[9_-0\&(?.πU"_T^Z%l&O6?he+QLqZ=Wq[ZA;Dk1(X:eJKs3G\bgH0N.d&XL4ak$LRxsME;XHK^^πU"1AmM=p?Q0;Rj9D;Wj:6bcOXjqYIlmyq''UXZ-a]IAC/8PtR\HYf-KNQY8D09L:#πU"SN/Ygi&8D'>P/*N<Y^3nQ#.N1C;a39^4$RmAO^Jj'TT1e#5ewX^a#6[%5^a.=HiπU"1Pd9]HT_\=iB,uu:x9x5ufRWkbj<fRmBS<40jYNIiOg,,5q&]d$]:BUXJ3XmMXZπU"xM:#rO<a/aJTHkr2+9SD4A&d2RofPC2+Sadr+&w7^AkIDcWF<)p--^ELU,&Ov']πU"ssO2qJ<%DSV\&OCWjT$fW]dAE(hD.<)uN32\Tqi%=sN\,.6g>tW?Q_]xO/$5&-RπU"c)mJxY=hRy/l/Vj,V8#8VptdCRsKN^*taqKvn8%:wo;i*AGrS#5oqT)trVtH\&vπU"Twi%5]scjd)-)O6hJrA'PTOd<nhq$[]>Q\V]3X<&VZKX&h\<d'$w5*q-&Q(t?3:πU"pzj8hInV\+=*1Jt)FGd*otr2B<jN.1t>rN3(T/A;GLp#l,tA,]D_Iqp6*>ejjVVπU"+mbXWV'$d)rEBlW$NbItK^0Gf4T9=>uVw:P[B3)Er)/.6.KD06T\>;uuhevu-L7πU"U'w%up%()9%%%%-%3)[VEIgQGK%Z&%%&B2%%%,%%%&&fWS[ilnf,dXr(RV1?^C&πU"GP<Ben=T7F=9h^UbD5[1xEZLd#A?&V-Lz[Rwc.0jT]tQ6Hf+XdWXeu^njr<Z42qπU"jBKHc2iIi_ksL\=-onFgIIsLWMQ'4n_54s2MLUS[*Asv(%W8+E8ar23.meSy'QGπU"&#U>Q_WGPQ.O%%'_>XM*#)&%y/z.d7\.*vur2<oxaR8V4AP]f\Qb_3UMD'usRgnπU"ezs_sReO>>50__rfs7KOT6?\1[3o<-o&B%TS5=B=s\F\fn3sV65-D%S9dP,Er2TπU"=f1hwtcGVeFb3T=-]L0o\TdBk.(CLd5qzrJH-<oee#d\%1([Cu5(TB;JY$AT'\sπU"-oJ/kg#wroH)R(:n3muXK[h0cAtffFnj?5Qm+K^PXAsGf1Tlkv'xD9MBa8%up()πU"%9%%%R-%m[\VEX60wOI%7%%l,%%%,%.%%&f%XSil4n^aV(3OE14j4H%)8JZ43^PπU"k#?h[[:(qS'v%13=,TI\iec_l#Qee6/f.K=O#,T7*[hYxl7eW^^]rJ^aH(M6FF.πU";a3Lj*nX&RtwX5Pv:-CCnWf4^*<VJA5O/eR\/+*thu_ZX?0x*?6LUlB6rZ/trI0πU"Y,.)(u%p()9%%%%-U%?.%RF;Ko)^Q:%1%EA%%%,%%%%jsV%SgfxT^btBoS]08S6πU"KxRWCu03Vf5*\qHsVWbpY5gc#d'RGuXTFJ+uQvU35)8u0xvN2$3*4I#AaE3pj5KπU">'A$AOn$trILx6W-G3DlWf08B8IWx]t#I=nn#9Zr'02cbGh[J90HuNYqFIGmrmsπU"0>nGR^5ipF'C/?k,)\Sst3Us6Img_7El1cuIV]<6O(C$PD;V.%Iu-870%8*Mma4πU"#*FQr[d4=$:]EhPHX.:?(Xtfl)MA4t-1jVb>v*GVJD^<ZR4GGd]A^IEei%Cmv=eπU"Osp\%;g75k)0[i\Iq5_)\%ibsYM1g5kY7>([29k4=LnmhsVOI-*b2\q&Is<by?7πU"]1e;2RjwtR3?'^tOCU]8C[]p^Cx3_m_Lva=;lhR<wMkjI3&]H<2J.KTba9stB#YπU"TH&r+c\8Gx8ZtW18JTN'%;PAk1+Pq.JbI5mfx*>xhTpAptP8=doHI&[,\U,q/9bπU"D<ii?LhkMvOPI6n>QWIZ5/gra.*E4p.FKt5;p\$P4teIPVgc60%o*JS>LB%]vZ4πU"8/Uo7M#%%\bbQoPw*V]$I^U>uiAL]CtZd:iux2roq0oBZT^;'X%0Y8Wkv>n(Z\nπU"Dt+XX1m#1oK8BDiplIPzwq7]S(oxrKvA01^#PL>es<Pj'#H2^Oih^$8T^:3eC#_πU"dbh2Du]XCgUJPTpDUJ_+ue&P9.I-+fG?d)K2^;oD>3Zn6F\mG3SCDu#<w87BYh4πU"N:\_y;qhLh_NodTCxaMBZ+$$flav/U<gqKLYFjr15HhdO.%XhtUxgLbHBFAd&\kπU"*Z^m#Y8AQKX6hMIA^HV(G)>tDL8E='hYXVZDV?dw9fZvJ8kq^6af#$yO,Sq4Gw=πU"0h'aC'4ey?4>g(0rwTTGb90RkDk<I$wWo0aJm#(iL(hTop^5w8.'PD?FDLvj<vYπU"e&B'kN=GM87JCDyRZ_PGW+GM8-<q5)<'6V]Bic^67*pOJ=gxSh[Jt30XX5Y<D__πU"i-KPD0nDC5*)htLWr7cm3S6G-2pQRr>X-W(RVIR&[D3#eF_cNFR#vCbF5W<G1MKπU"mxuSK#E-cr8/<6eAt\qtTGiquF/hk$c4qA71e(NJ0',lz9YR)uAXN3rM/Z6$a#fπU"gALC>fGU#Z0\r\c\?bx'<?HBGSP,Cuihi9\IdctqP(3)8y:k]d%7g_Vyvh-mmhfπU"OgTZQJghap/dT65f]0yfHffS$Y1&E-JYms7/l7ISQ'AF(1PoPM=>yf73(JE,w>UπU"+Vm$(RUsJ_kkdtrB6Fu[>dFL_;bcgo*XsE#_:DS1r$^c*5p:P$TY>LVi1.YK:hsπU"FI;BWvNa9$_&dVpfM%8oj.Le[05QB_Jl/8y*^437TmP4zQ,l#nJwd/TWB1YjI\>πU"->kJ_]-cpSbmL8wOk,YsD(q/8m[gt>L\wSq3&VfMj/IE01knEvnyg2_5A$Ic2--πU"oaeBvk\gDa>E-Z,II5c>Jv:*Y4';UT7*K4R)_^4a3gP_4OmKxw;uq=3^om^Rep-πU"kiA_unXDP?$QnpXla+sa?%.-;#()4Z3WLg.G0EJW;QlgX)I)SYR+Rsa%*'LB)2yπU"TDa0JWP;F1;E;nvOP%U.<aMN5rfqSI:-vHCB-A%BgRUCa.$BMu0KF[P17SZPq.vπU"+r*:s9S8nF$:P>SL2/<n0^koa&9I7W%6g5.6?*a+-0jPM4h;J#=a9j8QT42-/.YπU"CFYoZ-X(z.+mBMv5-io9)A/iFV9S\2Ba]X?Rr&PsL^ll[+0XX5RR&Jqa^vj:CW:πU"'9Y\_)OXm=gItptBHaOQ;)D<iX.-fOpQtHwu;\zJf>VBJi+0N9dx7\qY:CzyfNWπU"]o+0]R5q7US*N5m*>NS&H*zPZavNm<QP>(*>JGMHKM9h#+BV$HZ]JICpY<7V[QAπU"(=,4t:Fz/.g:cK7KUuasdC;o2#Q(]A>Q\q#n#q&n%mx*2W4b1:*,w''2OaXZ%#/πU"yhTicMD0;9H/+\SD'.Ua\K;c,nG%Fe*;F>tGQoa_\ni\d/eb8w8peO8,7Z?PpJoπU"SQ#o-C'3>ARm?v]:q56EB*J&4DsNj4kX?HG__O4i6bd:OXUqu\:vZ6]rBH##6U%πU"$1>a^I&3BGYKTgS=;#yUk5<.)6ijH$EG9k*8*RCtk*X\,wwnVo8Ic8K#IR=&5M4πU"-u)'+\%/W/[AGBI_\;(*109gPGHCEl(X,eZ/Wsm09wu6uedB>ApUjWNH^]'K1XJπU"qM6/RUN[mPfTsi$oP\+Pnf(IfC[2OC[AuKuf(,zw4IevaP\?;3:S/IXt[htw4JpπU"<UG&hir)&Yx^)8u:HO_uJdJix<'Hc=NM#aQfXW[R<W(f-($R=MMczP%.-XKn/L[πU"I\JmL;o-(/G%ez)l,\+9il'8)FkJ/vLHEQN'IoJkP=-7QL719aI]pdfFOq1A?6nπU"6W8-dS.Wi_]X:sOF6^9F'5]Mgs9HGl&h0j<o5F/2mq4'T(y%w8Q5/*9[S,Y?<*1πU"H[QV+kZMh6-YWl3&H-M[ZkZQHxB>F6$j_Y8VhOtKHF>pjWa$wE5GY;[a^AgT3ULπU"m[#4hJ-$aZOm$U6xOPcm:X'p[Pl$w-3XCpKl*o/EQrD#%U6Bx+j]4pkRKt0=3[:πU"1hmerp]=g6>=Z&K*US&Ka=t[v*>o1H1d9Frpn+)?>XK_/u]mi;WD.bH*fK32rJAπU";T7^j$az<&'ot^WR;%K,o)R6ZSDEXf=Yj[u5kY+tdm3K7?_1j1FSBw)fkF'lL>%πU"89-wa%E0bBZth)MSR7o[#9Z?oYTLU>C?b=O47-k2M9%JXz<iXJ=oFK=p4,E*mh/πU"b]$y#\iSlOs]BXjQmZ$=LRlZ9lk[U*Qw;Cp(Zl5/\q6-]<tMai4^=8eV-SBuGD\πU"_:qtIu)gP:u/3^:P44sgv9gvKfA-$Ln0&XX05QsgSZH^.gcDd5eDAjul3F.ub4-πU"%3r3>Ms(3<.%-t/-LeIHB*q$EKZ*?YS\WEYB8Y1\rl+$V)gT<5v,Mcap_>>+WJ/πU"mMmbkX$iB,+TJ(9m6CmoW#^NS,>*6V&zmRm.Y,TGYJ(E0,73I37Ujd^fKy/s7(OπU"Pk/>vlzCXNzau7[l_H2_kP8gYpr[o?z>WWkRk<S*p/gaBJsXWTUGSK6TkX;%gXIπU"=)\pM)Cc0btV,0tX8JNt.,J-nwH)BP3uTXplk]KfmmhPh_lL3Z/&&Z>jR6(qj/IπU"Psw+:rVss7ASb2G&:\c^JIB[F$%y\\vbdnZiu%RD5oJrwqB?5k'Dhr#6'Qpk\LIπU",GCPbQX/1F#+B',NFvUr*$;'V5Lq]J[c*o6w;7[LDA9lxrU5]pN+DPs:F/0bi3?πU":.'K$5(5F'fc:_3<oU[ylIfG3lP(gEH(E+]CX0GGOg\npEbV?-J:z_8G5/aHmJ\πU"6$sI6rd3+0&Pqw4#v;Ip'x[?_zoS^-qoUVJ]CYp2=CkGmnYI<:fD]ITcK8>bKP1πU";DB%BT0/Ii$+nqc1YI#PR?$<fZV*SC#>N9s-,otgZ_DTlH*.asLcS[%Uv8qZ5W?πU"mJKqK'))szFLL(3(W^v]Hfe_Y=d81%W^_h$RDhGPm;G[M[]5w<tM6MGLO9H-?P;πU"A$^7=Fwi6S:Ui>J#/l.3z]BcTwAED^DT6*TmA;'_r3>^+ZOl^\Y+dct&#fMKf=4πU")KPc+j$-A8lY<B'gpKVVd-Tt.A:^O:nx]p'<05\x\v\FY_?Q*20dJ3]f08#;r+yπU"[[f8[Gd6ZnQ#bHh<m:,Ku+i-w8Xdg3Kw/uw:CGY_-e+%W_)cWtJ#4dw^ahmy%L7πU"2CK#IXB8,dpT9kRq,Iz6N=O5pl]hv*^t8>8Ljl-i=n-]fsWO1\ArE'%Lxc>]<GtπU"jf=(VIHpN_X#)_PFg#lm==j>,k-em3$R<gfQ+B\vWIQZruP5Q#Uk/&9RPJvT71TπU";RcAI<X8s;fgg[M'AW,rnTFJ6UBS+\e=DMJFG.Q%8*K;MP_P8[UQ&h)=RFd+128πU"Kth.OYMgjZ%(2)NI*6?k$CPN>(d)5NhJ(48:D6P-TL7+G<t7GWaxr4Z-e.<f5',πU"]5ays$cFSeRS%X*UA0XePT,]^Up+Mur[*S#<:6$+e/H4bXgXK&TATjMmaWUra(YπU"hm%rcbNWbNN]u6>6K,DmtTPd3$nxUW>]_G,\wcoXP%-yf'F2Zfn\81(w7*zM8?AπU"1cco<m=3o'uilVB8ConbO4(%u1S<pI10empRGT/q+HeENG#r+\zF71=01u?*+B0πU"q.+\cV*(cDYZ2-g[W0p*>AY,D2W2F:5NRC\)7Gdx*>B6Y&U)TWw:bQ>mgbs22oKπU"M=0U0sME-]I+=i7R2j/5Lx=RpbXPu]P:Re[8pnQuCi+X4Jp>i_m2jC.,uEOND73πU"=Y>of3w/UK9hPd.p/,7K[95#P*//FZP#,Y=#2\t1r_euOBQI3Ihj(KCx6<30T/VπU"Y=IY3M\uG[ix84;xWVYFr>47\A\zL>=Q+TRUZ:jVyHP9^o*YB2jyX#b9>YJqjYaπU"f&yG<xkb6xCE7=O<NJS>yN;>(1Q>W4ouUW;UB?WB-flhw;nS'llWkpKL0#'bZ5YπU"f=BjGpztLrXV_o)e&hl$E-5teG4L#'*?fZB:u'+VRB:WiAaCS27bA&a)V=)N_EMπU"lnGD4gdQh--&4WSFc2FxFM\VjWwp5ZoHZ#p/%eFu(rQ*/YB,ZG2e[6NMGU$V,'4πU"ye*F9zGgjDM/6:7nCO&Ep4,z-Qx;u4$ETOz=iRRHOB#5#O12,xLH4,*xGC[)W1RπU"X,*t+G/?W\1P,JhwygI0vnwq7mN($34K-#eUQ#OgxYA-)yHW\%9RXy(ZRsX:4&JπU"Y[hzZaOcl?:(/=r:r48_[oS/'&][[#2$1D*0$'izVUy'X.W]B7p1u:w_Y7]0q,xπU"Y[zrU%7M/)/=pFzZk=$25zj%Pzz<;p*Gh8%yFygz\EI5HAylLxD\EWNHAYi+hy+πU"KJs*eBUIb(&djvv%fxzf<Sv$FIP_7yd_mJp(a3j.#rz.8gdnV%iakxcsAfjl/_:πU"tXgZtR7dd4(J7_xL_/W'36*ETHMI>I>>D4aYIBYheP1Uj-[k;'gvSz=\,.Wtzf'πU"<:c?E-l,<n6fPl2o\9Z0Xk=[Df^=BW,Ct5]h[:d$9Qg+bMYS8N98NIKB+k?_RiDπU"Q]=2zG/(T6fa9U&=W]hGlJlo$(=p8)&P9]2FW4U3_)YSe&ku'SQLq.CWNJ(H>muπU"N7YOf%TK3rOIJRfK5?cZ9u2&UE8c$66e2AKE8)$3)e8&AE8l]7uE\Ju&UdLGwv<πU";'3GyEnVB$0'Cq39N_[UauxO.u*PM?QWCzU<scOdg_M>Xt+g2&eO4B+9o2C#k?>πU"d%S3(f*2WzGRc_I7qLyP/Gq(^pc7gME53Y)ud*a6+gBVm6i95)Q\fq,14/;ZSK(πU"DK3N$Npmn,L?3l'tWcX.6DdEbhhT.B<8?E;d2,#HxA$m>oQey=HDJkhG(VXSMapπU"<T4%p<1&p(Rr;L\#5?XM_Epbx$ZH?t[pk6l77vil#N#9MUs/]agFv5\nshlLLSpπU"t_M$&)el&:'X##j9^Z<tJ>z6Qhgt-[wXMi7GSpZR18f8hGpDlhnnPfhaXtuHZn>πU"H,Et5$8,RYGIe1=6gP4&epzSvaR\DfqIuGu&5__bGX0u.tY4%\q<M%i3cpzrE8:πU"mz,+=qHH2:1,:o3Epq<S.mZik[Q2<UaT_:%gFphfw)9)VkG4DlwVNV,EhVH5Y$>πU"FFgd*Bf-O<2znwS=%T\jhXcKgbkCCc?br[R-?/KXJR,H>aVgJ-PKCa%a6g>#t$aπU"#(t8AaXbJ%oN3$LIpGMn1'L8V<6\T;:4C;-LVdR.cGR_dWYRT8hkRB<8#/0F.$\πU"0X^S0rY0rf>_ZPv8hV<BDA/d4F.\FF8'UXW*7^PXI?XGp_42Qak>5FM6a)80KF8πU"9rM3i9JL/wLki^0>sg_h+MkmdP.1x?=6/Kya[&G1r'eIOb)L;.hu8sFS</F<kuFπU"4ir<-3s+lpyd>;Y'w2)e'FXV8iXJp#Ef(N,=chNRo8Y,2JNGbH%T?'0Ud[<?vQMπU"LBpJj_mnZq_o/.?u[['ZnJKR(#iFi;I?8FPF2sf]Ho#<<ml^44=20Q8Li>qPWE0πU"vMhQ9wqwnYG9ntQ4ZOpmu&a,qU$XN8]VcJJA3]MUbDc-ypZpbK_:S)fgNxjY9hxπU"wF:uoG<)rpmWi3eJF=)i.q$7wX\<Txcga7[ndnSrq29r<E(XL6:.z?in=)o=m'?πU"+X=(G0/+7KDOu-'9P%&)'I7&#(?/R&3%XOr+2Is%]fX^347'w844>gO2XPBZ6$_πU".fpr#J=#yl6CPc1f4klY0\MUpCDl0GUdnX/ivjKYDW=3^KD2HjqS4'$%K-qqXA4πU"/:mq-(YF4G0:fp4\qBEU6Kmi=)^1qhb,ev6cCG*:LfJ/]t#[9nZ:)Lr6[(/5,9yπU";*6+<[*J\8pZ]Mr:eLj:KKg]64K,jDa<WO>f*>Ast]atDFc_f^uokvP2hi$uI#DπU"knM*vV3CutLG9Ff^_8dp2M28s+HpCY8h(^gE:w%j1#Y:)K4F80IR_+kVK^\D2HBπU"-G9%FAj_kk/lvzK6BZ=tAp*::G37F<K/Ik30R+uHS5\hP5nC>E]Bd[<OI3Df0WSπU"3<1;\H][L9x(dE#GBK9m(%lG^5/bM0>vo?5.KS/TbgZhUQ&bkra>Ph-De_Lw]\HπU"A[)m_z9PWkRp3o$0MMpY^^?#fE\zHW9Lv&?=QhEjjlAk[8ne8sDL'P[stc-WtBmπU".WP%0,&06$eM[2pgs[(2q<,6\/;K4re0tA]AZ4w>cK2Yi83?hCWsNB/[n;=U,-UπU"w:Lrkex)[8Ft7ZJb;g1_JY,*n'6'MYhqg=A>Mu7Q.>o.vQ]GZVP;iI9<n5H+rV-πU"^iir$#P]:hJ8XX8pyK\LX8seRZYoA_7su_..v9$M)oMw;M::nA[y7wk[g<ykIo6πU"%+<XN)/[J<=B5Yl)x%A6uuR<*Ia#&*JH3vrdI[lj/vX/ZqU_Yvx(>_#Nz5iJwE2πU"]JIg_#Hxs\rn>WshA;kZ\Oa>;GR=<^^DRmUxZ2DJ</D\3l)k1#x#Rfid\eHd9lwπU"^'x(up%()9%%%%-%1yNVECeW)m&L&%%%$+%%%,%%%(q&VS[iln>5c:#(#V-jFg]πU"sRQ1(w[9&bwMGPVMc5.wj5G[cgg+j42TRQ*F*Spe._$ut\3Wn-c(pZdw85FL1biπU"oZ^J?6EGo,G?L+%/ow:l&[7Zt4[<cy?..+1hSKxR7PqV5906IC'/8JH_S<iNdsgπU"9/2WYxu6jN,Fd7^1=IDNs*%Ho]m.TQ07$k9.i1PW&7GnvJB7IEe#)_H7I/?]:hqπU"Y(lQ:*W0=>65#a+HkL7D.du'T(d&Ts*0jS'T.A/.eu>,2)_3Hs9cqB#<^ey(9xjπU"JcJh6lG[isI$B:PhQGDmmjiry5_H-E<_:730&Q=b/*FJgAAa,>v1oxAb/6OIj%qπU"zussr,_Mtqt-nC-.;PhnVY'l6k#&=eu8.I7<(+LUkKkFFuCl()fAgHGTmpTgI*/πU"4zGM?5)c3XecZ21#4'O9>gs1M#\fUZm37,^I%PuR^=T0]J3qh<4sCLj47XEr0JmπU"#TUMAO#8zH$o8CQ:$:$Mv'%up()%9%%%#-%KOSVEPx79qq%%%%P)%%%,%#%%q&%πU"WSiljn>a:%r*V1(i&;JC51$&,Y[m>[x)Zv1hip/4I?]\+00TFe/s>+cjeiBZ#tTπU"#7ad5CRTlx4jbvpSgtS>1uV9n:X,V\a\Z1N\9g5#<?oT&=e]Y3\IC063f1>[X*FπU"a2/.&;jk%+%zrhUf\5I=-Vd-::XH5H&6mHqFAE4r:I</W-e+Q>xHEL<XmWL6F(lπU"grv&$u.72OpXddJ7H7,pL9X8m1Prz48%]tmnmJ2D?gR*>*$(Wa%^s6v0jtXU&E%πU"THZ,A5eOFN\SMBl*qO#$6z0w_6PP%EEAu[[3sH]l2+rQWtf=60:b>^n'rbfsdb%πU"8up(%)9%%#%-%B_OVEBM[7Ob[%%%D%'%%,%%%%q&&XSiRln&$9J2;U#1iH%REI7πU"<(=Rvam)X^</1<ue6[G5&hc+t5=Op][Zf$v;rfD201ljj>;VATq0xX::_PDzY5'πU"3R^Iaij=a6Y><QEUlk^(;H?:u:eRAFHR$\f27Z.7([qXSR97h9.zJ>E/kJq_4NUπU"WIRLg/2__27a#bCqKNFN#^/BTS]gxp<hMXx$xHCG%<up(%)9%%%%-%B)ZVE=V#]πU"oF%&%%$%+%%,%%%%w&&VSiRln6c<V<<UL1S\J0a+#ELo2Cgb];Fs'IR$j_Palv'πU"Ig6)&HM&(cJ$8>SrAwKnNC#tZTPj#cUxRm4NJH.Ib\?y->7qeH\B?ttw.->/n++πU"9T&zMd0>*D64(FEy)Zj,x\q7)2#rfLub_*KJ\)TiN*ozqu#rEw$.m*?J['VrW%JπU"CpHXb3?M_H]n1b;&2[6d_dxaxue,(J=2w.ofG'd0l.k8L5mG:nq]'7;NLA<C%MxπU"(i.IHS7Se>EJ*P<eU>of+op-lmW?ZXjffe;\EtEBBoI4>o$&B4Q%u\'4j-c-CF^πU"As\op,^\,ExhjXQcS-hVZWKF^k,7BR:kpQ*cuMn3cKdJ3RF8J<+io5](54I;RrWπU"/$q=[X6WB>L_p38$ium&fnnIHKJjcKDH<=G730=i.NEBF\AnqbfT&$BEk]KO7jHπU"6^x#F=j1Mt;^Am8&8#_I=B&02\djlH?h)I(=^JPw_8GFpYE1dTM%&up(%)9%%#%πU"-%,_ZVEMomEpg%%%%P%)%%,%%%%w&&WSiRln>a':r*V.1i&;pJ_8/DBtM]GcZGwπU"J848U^O_=Th(6$q%7g'khJGb=ooiRpQ0P<JVIGRmQ0vfDTth.n-dq'&]#WlhA^NπU"58A_>.8*)xs[1xh[j)#%zQ:g9:Ah[D$B[KgY9WEY'y_Rh2&'I&0.Nl/eOST<lLmπU"CLh4DG*<(qYogFsFc6(A;i_Yrn3t=&#<q]X>kuaM02On]mac9rAw+:D.BG*^Vy;πU"<#:XgAM%^g91^krDG0(WFu](4Yi:);=N6I:(,\4u0$\hnvVl<_^+l00\i4?is3jπU"/=<7x9XW?XIVx9tdb(%up()%9%%%I-%qZSVEs<0=Pf%7%%D'%%%,%#%%w&%XSilπU"jn&$J+2<E5.hv&Mf6$>L7V_C2WJhk0)4fqv&xcg,VwWrG.E#Zpsc#4.lvo;(W_ZπU"+Z$m'yxatT)g'Kk9\jE)bbC6/)Z$Zq$F7gs;m.kgV=#.^c8qdcFMhaj_U52mlN?πU"nSB6/C<zLEL(nOSk\-xDsxLZ7_FdFVA$R(+SI$lqnUr*G&h=^N=kfzlXpyx9e<dπU"0%up()%9%%%R-%;GnVEuG&w:k%%%%8G%%%-%%%%gf%hpSimlnf90B.SUR%%9O&.πU"dCn2K*dbV<ZTY8/&r+nAUlwnNF%p'.aF(8T)-5GP;.rL^oyl_=;xQ-b?&z/lUi-πU"797Ig7+Kn&%up()%9%%%m-%'-n_EVr-Wix%7%%l'%%%/%%%%xq%nrjV%Siln,tKπU"f/'9E1iiJ^vaJpbvz^Co#*EYq5:pKY,mRjnM)sWUbZqqh9).UEM&mM,ZQ874/,>πU"6x$:'GQ7dr#\Ogjm$SH(7CK$G.2Zvb/\fV,nq'u%p()9%%%%-U%0'd(Ec7a(5c%πU"%(%j&%%%/%%%%gwn%hpZS#iln,b_B6<#U1(d#4PmrO=/$6#/m#71M,3K#EfNVXDπU"/5ug<_-HrT)pD_2,<AUIWIt(j3k5<q030U7-P62iTv)_sX])Xd))hVsQvFq0^.SπU"H?v=rOy'pFbc4(L[Zu/KhPj(V^rBYaBm8[dWaA*v5G[J8/.zuRN?kv$qxU,\'G3πU"ocdv^Lo:VLY^=yu*_3iq>u%p()9%%%%-L%]cj#EbR/'J)&%%%^9%%%1%%.%q(x.πU"nf.q%VSilsnfQJ+6;E1=+YXBGk=vkfD^l:.<TmC%w'F9/qkya9ms]Hn/wSlAIc&πU"V3v4F)R6&p:V>ZCTNtU._,\H<a]+fBUnw3KAq\Z0kqi66^8_k[%8%=>=hl6oibIπU"Jn<8(lkvh+(rD?AN6HfB/C'&<B5K_9f2LJdUD]b'GhZ)B]63,lPYoEw+0p,h1-)πU"*G>(7*gVl10=PnQ3FEgY;M$%*;A2>7e'>t>*^,:pt,L6uQO6\vNDslHW0&1k_]KπU"mvJ7SLDG+vNq^kJT$5msjrX$lewGD\3JqN,S&Uj6^n$74[=bx4rFT$c%[<u*G_:πU"<m6nfw;.rsGk$s]XX#]%\up(%)9%%#%-%:$.%FQcF?W*[A%%<'-%%/%%%%i%fwfπU"m%WSgfOxF,<GB[macwW6vaDcagj=tUjdG.;e$Vl3S'A[\=EtOC5;E2\g_<y2P^gπU"AEJXCxtz#<.yx^qxqLGF$4eV_mCIJczddJhJYmSN^a]nK[wq2P,Ua,'n;fR=d+rπU"Q\0>Y'pkanB\:Dv+f3so5F(RJJnSq(Qu%=\iu*EQrt2Q6Wf.7LMBHFJeJ\3\p#PπU"g*P#5]5EG0hnQ1rXfYn-kbMEMAi;nk^L>lu]aLd#ijN,\;6jHU$K4LdW$DV_s^tπU"V:D471LjtGkHow.#CS'SC#uH5J(^\WkwwxFPPdWeq8#Ko47xuuX>#gT.]d]Z=8:πU">j(jNATxq>hi1BJv13%?^9$nc-/c_#JSpjqdW(M^a$UDAGSGIH0r20)]GQnMGh_πU"V=12G[eaXo>rL8kQKj:AXLN:4mMnPF.[&9kF$0gCenk1[G+a4mnx8m\djkhb%MKπEND SUBπSUB V3πU"#S::aLB,Pz^4mc-Nmp+o)nAzgsCVeaP4#%E^Qf?iB(a9FVJfGt$Mea3ZRJD]N&aπU"au7f=W,(tKJz7>Q2%\[Tl7Ld3]F<:IwzeN]0Vtnxjojr(N4+F11C<r$<KtFe5R\πU";C\QtVN[ZYZ7K%[<IlvWR#MTit'95>?bf#l?s&TN//N6:,-Ddk/V0w=UkKQe'*BπU"$/Or=)7L(e/9)9+Bq/>XUC+ZmME7_\[M#x_Fu>Zs)K[aaf102JP':zG%O4poS56πU"%FLfxXE.O515E]7bBtj(xA;OS42nrnV8snNAcduc;^FQaiwHWEMK6t6g*7VhB6\πU"68k^tR:*SoW936YO+uB)+v]1N^W)aGsPC-H(fh#CG%)_<X'q#SRpX*WCCD\wOMcπU"OqbLN?01a)&9)Q9#,,.2Q+YZ1>6,nUVdhi<0wE)fZet9r446t0>WGOc0Ag%KWxLπU"aAj(?h6oLleA#Us+d1#pdZdfL+Bk]RA3jndokNappS1W/8PSPL6<P7+/Iz68RmbπU"-Rq6[XgpmQ-+I]qe]G%iUca-9=)b_x&,$.#=bSFkEiV4F[7Xn?^<6/pHa^s4wbBπU"6mN1MJNua).1IadR0tp0ZQ8(9u#J*HKJ,fGe9x$iwd5'x]^ahA]d_Z=rohbd3?eπU"bMeP>TtHR+Sh+t&%*v,v\5+yT/<+y?na\VwJ_BsZFY]LneQi_IFh$GbJq+vrqZ^πU"uBc#JU82P,&<8d.b3qJF0vkNq;Kc8nlkp7^qk+jU<t\LY?ouQ8,/*eWsK=T8fOkπU"h36b^sHJ#egT>dYzTc3lHdzWn?daw0:3Mdd5'NdG]gLr'<Hb\>r_+XdQO3a2/gBπU"8E\0=v)8Qsv6I1W>SFut<b1GVEMxX#i==aET;QK-W?#=1=]?ZVaELJKu2T0)KhuπU"\0S#K+z1;6)=qBHu*h+=5S8)RB[V6q,j=)+VK+*f4s#\CjA^ngMmj4BI2B95\3KπU"j/f9Gd>5Tp/M][uA<_ROc;tRa*US?%1/<1,739m6BH&-<.f,[p1,&K8&o-b%[9cπU"[:'9HY4nU1JMN$/orDiFe&%KY&+j<'I0d.uwcP,I>+5c6J/'s2S0'my<DJXC_T9πU"dCm.AY<epE++<o<imL&sM-.VCK7lCt?19ME3G0PAmha2g,o?VYRw^p-vD*b)iGkπU",.=y+;<aTMX%'9_CObI&x\6)M5Q.ZCOBog4gb-5t1f99I1+QILaK-tG/JyL3P2XπU"Ya*CuG0h)b6t*bpCFEbk/aGoskxk5Dwm^bL[X*TR]q[_=i6U.XUv$-U<UL,LUxVπU"-FX9Bqvuj<o6GLQXsJw:\I3xUdLULV.Nc^((t4oqo]eRM]e0uq&+-9scE7e^,cdπU"%u-q5/y+oFK%GTT<o=z;g&'&7X%He;[BrZc)#:ez122DP%.8J1-o0E^oXa8O6a>πU"m)#elp1<pPOg#Z9_&V89O6aC60-u^H?\sBT3A[EZA=YEZA=YEZA=YEZA=YEZA=YπU"EZA=YEHA=5Ed-M$)[h%jQ^FOGe#5e6E(-o-$.)uSB7'M;3I&90V:%Y)hGoT6E(-πU"o-$.)uSB7'M;3I&90V:%Y)h7%jQF8OGe5.e6E-&o-$)JUX0V:%Y)hU%Tp7u<>mjπU"\%YV1[BWV1[BWV1[BWV1[BWV1[BWV1[BWV1#BWVS%B'oI'e5e6JE-o;B+6y=d%MπU"k+Ih%4b:opk1get%J9.tRF-If-$.)uSB7'M;3I&90V:%Y)h7%jQF8OGe5.e6E-&πU"o-$)(uSB'<<h)h7%jQFkO;J-d6Q]j\%YV1[BWV1[BWV1[BWV1[BWV1[BWV1[BWVπU"1#BWVS%B'oI'e5e6/E-o-#$)uS[B'M;#3&90\V%/07hefiB/;Mm*+%%j8'PI^(.πU":*u,S.'M*;)&9G0&%Y*)%%j/'POG'%:e60O/o-A:*uSK.'Rm*)%%jJ'POAb0Co&πU"clxD_]%-DFr=']%m-DF=>']%-XDF='-]%-DlF=']'%MD2FMJK64js7%;4b,GeLYπU"O+3B($cm?eR]'%mD2Mo;A%)s^+u[[^PK#l(MjSk:br^&crG>YmJ%0CK6jEs7%4GπU"b,GLpYO+BA(vci%6u7cqiX*AA(6ciYX*A(I6ciX6*A(6gciX**A(vc.?uqrrGYmπU"JF%CK64js7%;4b,G/LYOG/KYOGeKYO+3B;$c4?ak[8hRKld(MjE4;br&Jcr5ZcmπU"J%CaK,jsJ7%4b0RGLY4Ua<W2*s^+.u;hRq1tH=V'3/WAdc82G$RG%0sq[jh5Z'bπU"#XV;h1R9t4aMJK,=j'm&Jcr5Z,+b(MbjE;2'K,u[JhRAt14o;W,*]oDjeR3/EAdπU"cOQ+B;$CPL%4GbRG&9s%CKo,j'mC&cr5;Z+b(:MjE;6.K6)Gc=onYX*A;.6PLK9πU"?G,j6%mh=bZE;*3K61Q:W*Mo.Duqrh5Z+bd(MjE=;2K,.u[hRDAt4o%-$)u#[^PπU"A/t4C$_jk:2'K,u[I^PAtL4o;A,%]oDseR]%EAdcOQ+B($1PL/]uT]%A/dcOWhAπU"%RtGZf<F#c)4.C/.e7pZgPJu(KdhpE[sPU\b<ru;04mJfnA0#hl.R3bx<*YRtfHπU"q>o6'6eL7w9uYf_+j:cKcQXjije4#r=b\Ler4>r62m&sU0?M[n./ktHDR_n0TSZπU"S2AYzXt&yV*(nt2V+1Mf=2Mb#4:M/Q<*Arg:r/-j:q?FO9MG'/+GAiNKYrMGNL,πU"g6.YHeIP&6\ftZsU:/&QJT#;>OO9M$Q]2\7x4-21Kg=#E\8OJF?qyKW/8PG3/0zπU"qPp.fET<)h2m9z.Tbs[n#L=pl)(6]UqBisH;M/'W&lmI04Uqp6fb%=)h&r:L:3/πU"3[zFo/yDNT/qEM:jy-NQz9j0LWTxQT/xi^%Lqi(s-(5aa?)L^H4dg;Wx-N1kP=\πU";:F]Z>2c%quZEKTJRRTX3SxtOH$YV%fFCK1&&qLxb[;sf=+66sM(?6v+vm/hN]2πU"daWf%BN;[X+AOxIu0Mq;<iI^a\Vu(ohGiDdmT9?c?LTY(rg2/I;=7c5MVXKCO=VπU"hL=-7Vx%wfTC.nIYhvXT=oFlkCwY$ljj9b4;*FKu?1aVV)7$hd*L0R_1t[;W[(dπU"kqOLUef\:$&FwKa)SKLF&8^+5GcTju&J:IaD7OGwB$vaCMpa)&f>G)G,c92A(;EπU"vRAoGD1a2l5_w[#F6&Fh$&yiv*+QOs*N8LaoqF3k#0q;^ZWlUy.^y%1BI/\DOGrπU"2,<z6V1&sQ.cs8d[X.Osa$HIIcP>neH#OF#\zx6J'hJ+PB.Do1U4e(3ldIYatW8πU"S3Yp;o2iV_wM;p2r?$dU/,i-=tj8O/TR>5(i:WJCT%KlMXLjifdR.G,X^mBWg6,πU"m#n_kY\tR]+mq^jy=fXT<Xn#X7t*fbwabQWDaxVn%i(i(y^\IW/A%rXst=XV^&-πU"br_.VuFi/?vN-^;]1Vg-V/nt#ok3TeOrd_9DYt\R9$dX0Tcts'-pZG.4l'Ep;,EπU"Cshb>Ij;+U0GS8LjO>j<6b_;pd;jKhYZdhC\YWBto%+q,B*Nk&Tg._sHyQb=h.QπU"ULS?G<.JHPE81N>8YxSpbmRj;4\PIJ/Jtm%^s1LH94Y?uKJ$5q;#0XbF<fGP_f*πU"6deiFEnf4DwaThU(OTpbI95<#'zMy2YZZWBkP=y#IjRgRPEQV2sHjyQ]lO/)/wKπU"aB&cM#0Jn#ne?ATaG:dH4T_AJdd'lHJ:n'q6pj[DJ^w0gqQ&4Lxm5&ch7,vI'I5πU"DM<&f.N,=O&Oi(0%pk$1)VL3VyF'uN-Ef]VteZ)w'VDs8nLqX^blQ#i;jPW9<OnπU"e4TI&<<8#HpRUDSlSlg*whXpv0XtK6YwHkc=-Waj<jh_0EO6$hX)(t->cm>:WqiπU"Xjh8\BexD2PkK-)m1<6xbFMOXj'n_i?Q,F<,cS4:r/*t6RGs>zBVt#p5q8B#?:pπU"JasIan%<XGXt4lj#7DJXq#rJJBwNYqFZ1xF<dcrf8>kq$.***NR]HuOBXqbre$2πU"?]^TWQV:,-0#3cs.eBeq##IAT/mR1K/dN#<O/kLjaMlfrH.]NUn4T%i0IEcn9$hπU"MuN_SPu_ONOj^&zFZ,(Fztzf%_TR+oiF1dZ(EP=(JUrUnilmSD._(:W%iP3z_NRπU"u,:[rc,.ki%J/P8P)b9Hf&KWdnF)bbHf&aKTZHU[iQ^?gmTlQp=MCbvXc34Lor$πU"ZvoJ<Z(B)-kb.rTh-b06^K:l0T6K<IOrO\O=vH7t?G76tuoet]ZeTt3cH7tGc76πU"tSn:W%Ph3<n-iP3'(HBSc8Z(B)-hbDL+n6d\Er7L?bcRH],M>n#IooXGehj6kf3πU"(^x_8v\vfiwJSeY>8)R\R0[nYV6;^txjAFnMoFqc>=0m=$tTRW1sh[\>9vQdDlQπU"iB6%0j\&m57Uv&Zj]^7Y>-8N4]B2M-?0;fOx6VH3N:sD4=7Osa;L'TLf%9LA)s]πU"Nv5bf[y0;:q[yKp(7Y#83'k3cMeqV#yTtgv#yt9:Z>.#,&sD1dvu]HNf/x1]pjVπU":9E)w_k?5YDSR%v*3,M:ULCdVN;M(Y#83'k8?5Yyl0dt[)S=YvEQlp#0;fO8d3'πU"kcGERyk-iXw(PkcM?:r#;fnOxf'5mS7[od[VL25bOfT<n9o?b%VppyB<fk?BsPlπU"wYl_ak9E0'SBqZ=\MM;m\=MU7-=]ko9E0S&LxZ\GKdB7][N=]ak9E06SV)Za\[,πU"wsE0SX=&MU-j=]%4Xl%_U&>X)rdc*RUR-=]%o4X&_2U>=)#rd*R]U-=]+keh.&tπU"6#vT;l9FM-Q%h,Q:o.g=KSS*FIZ\$U)gd+q:E\m'+2NS=6%L4mM);Zp_M-II&RMπU"II&Rm=I*.:i]UJ:'IixU3A\Of>=.TFq:=1D>+k7.a=]k9=E0SrAgZ\KIDT7q7N=πU"]ko9E0S*&nZ\GKpU7\qN=]ak9E00S2vZ:\KHW)7qN=9]k9El0S<'IZ\Kv1Y7qNaπU"=]k9sE0SFB.Z\KSN[atRxUA\eOf=.M*I:=Qq'??M-o/_d#&RU\9\7P*U?82'$*/πU"+]26UAW&EtA4B#rKl31>),]].=,[^.=5[_:\=rPUup8,U&D'BH/A_#&RWU909?PπU"UiQ(.k<Ma=]k9mE\\6bRF<CUy1d9(FY]<BeoAA$n]<ZY&7sdQ852N&2RJoJ>$7bπU"Iq;QzrKaw)CLyM&Tm0lEtwa8e;yyCO6\Hz\P6Uwy[p8+A.4Op=Wk/N*U)0u'WIFπU"pqN)hr3B\:\BFaqH-IXCtK0>'eQeRU;)0]N'JgaK0e;o'-(>ZGqh'5/wc&2wPLVπU"Q9s2N;eq-g+Ym<\qn?%*K?6b-+Ham9PPG;\XE5?V$w0'NM<eYIcR%Z8cbH<^4BKπU"]ji,s:1CQ?.+.43Q=??j<h(6_+hfGL;>[8eRMVq%l&Q?dy_z#W$0sFq]GlD_e-*πU"uAVKjNx%)2uaF8PR2Muo;[HQ[jQc3Ny#CRabjW3Hgyb\_o.>0jVUjI6ZuZCU34qπU"Ceg-mWB1?4*6)T,ttUnX>\M.?B7rbKhlZ1#u4Q?Is<^*hp9da38_xW91lR2C5K^πU"N^\iA,Zqf1tmigCP*+diTLce+$G=>cdq>.35>IBCD)-#rjZhYIfG,tlsWLS[o^aπU".x5#b./e,j,14*V]BsL'][$*i2UU0_f\F7U:,A)la8+l<)a,G-phylWlgvsZHS$πU"T6S-S#%Ccz:L^<eY8Kqq2p4s*15^^;x,(UN:ohlP:YaXk7S,Sam=>iBBNlrhSWdπU"zKcidmu4lfVL.P\Iz)LeNdep\,6)^Y5nii;aGB-.b5</9Q>_c$evO9Cc&x_eWtBπU"7847IQ%W3KN[nt4/I6dd.)65(FP?b8%rsssrQN=l7Mm$f<mmn8YeG.dML.6c,vKπU"3n[_PCEf]Ic?;zfpwBYP-dUqX-u>.\>(G6bO'/S.ZdkNG3ORpR.?^[izl=sqkNNπU"p);jKsW'vMZGlSRT2nw,8ij5%89d.,xNrBRiXBlH(QGdpb2Lm+L.rbkev12U-H;πU"m2RdkD5t)1x>bfraA.ItKSdYQ^T+j8wtHZ]#6Pnaw7xt_a>9)$j:_^PN:03La3iπU"UIIUewMm630N2\qjW$EBuJZFx<ckf0Of&i[X<t[f\vF\nQwf:??^^+ZCRwKg,KxπU";[.;7<Gf+HRa,BkW>.ryf/Dw/.(HLd[hcD$GZmbj7+.dpmlQ],SiF(LDtWR.WQ;πU">Rb4;c6dMlxM7VpveVJNhhZeTDDka+Hikd,VN.gy9;$n/vR6$KgR0r.2DQOKRK3πU"Ryts+2/RQaJCvo(a&RIP<lJ:]4h[wX:$C(6_DvY[XFXw^E,[j#eZSqW-ylG9B:&πU"lMmyXU7JF$tFLNko?(4aWS-j+A>(d,YWO^*wQ/3T4c2Djs0;+ZtAzetASn<Kc6&πU"Li;I3cxUGa6FF6n\45S8JO8])5Nvbl.o'OOKaU;2b4YlI^Gnl5'I^N:.hcukg(eπU">OF>.bJKh1hIoVukBS/,4]LFW5f3*LGk>6NY.VOjafvto?;w;G]oT]Io4vkE/&wπU":DJt<CGTMDWNnkA__Xtr,*-E:D,\up$T)I/e#X*FF78l.bo+H+n/qaV[Js+[*f-πU"M3;zi)owJUk\fcYiuEHkwCsl^*.:%JpOIBmT^Bx7dV6ytjlM#Mn(m7h$g.Q5<ivπU"agv^oD'cP*?2vQTf?\\1d*55,d8wdR\=11\Zbg\5qC7)2jdX9lpc3P>-cFPL+MuπU"w]EERuVquQaSnrlgeW;(^w\ZoSBW%Eb;qksPm8:Xt,p<3D/vbY7OH<gUEDb\gk3πU"lpnr(Of1g,[RgcEV+NTp/MT?.q6XM=jp5-*=lB;qaMa=]q8l_;chg*&)PNZ^1aaπU"s4a#%H\)fR8F3_O,.))FDLTK6b]KR4(^Vg]sQ'94shE0<hEQ0TJL$5$lnpt,2w>πU"p:?8>#K47uxuX>?#g.]rd]=8$:>(j>NAxqW>h1BGJv3%8?^$n?c5Ds;+#+Z/ygIπU"A$GGIHP02pM8eviEj4V?jI=RHc>Yl;TeTqHiSss3zb457#rjK:<BRF9E%#aSCtkπU"<e=oFt5uhsdn-IpjT3pl&Yc)Rv4R\LM<aMv+d_#l\$I6R*dB$Dt+uRP4>,XBvdrπU"njB6e]Qwo3jAU\v0%J<$Gee=yb*Fs=B.:t3GEe0Nf*/Ymqc&tsdFce9q7GNER\vπU"7o$CP.37o3tQIXw$_^y<;Y=X7CQ2w0k#PP0>I0:Og$nTa,;;W*h-LDo=Kdd,Z-'πU"efD9P-[kx=O,p]U\rvqGg+w(lkFC4Vh<N4,l(_SqsqN6e_l^bb+UdPr/;l2mx+vπU"f_fKoVPo+bnH0BB4b>=B<<s7QKI6wk0%SWjMr].RqW7Jb>$R>XVm+6:/FPgiyf#πU":n%Q=evk_hp,#uDYwhHvBkL[?'J_14s^dd.-s,mvCsePHC\K<a1[L#DGWVhT]ZwπU"iI6Q7nIhq$XH(R8:UvR_P=)5RbL1OmXY(:+lPa88rsN)Du4TTgB)\S]79FDV;MLπU"be-GGqaW#36Y_girF=Np-y81IXnoGp%MU,r=(>x=#LurZhes[wCR<$GnA<%5>7EπU"$t7&k]kd;[LUckGpNQf8?XhoT?;SL[Uo]^:7meG*l/:a6AnYJ,^Ok.30+qJRom<πU"oFK_WzWKOhN\%Ft)t)>HK7;JK6>f_e^G-NI9sC_uZSZo_#KG;n(<--+UYMqKw-HπU"Bb)ItnUdpf)k)GY<u,8wrM)FP'w*O1tz]/VXb#H6A,d?&%OQdQ8>OC>^UX2hpiaπU":V'dNKClby&.iQu\\R:<qHCkxu]JwI#Ny:jFN$t#D[nQ1]5Ez]6K>a\==xCH]oaπU"<xrMbO&8kbj,K:R.AYj=+VgK#RvBp_nzQtC+5j5$kFkG+'jX>t5]ICI(x/sk<aXπU"D*5KBk9a?0oN':0L?3a,>/j?],:tPjPDGWr;s_XJimRC&ly_[9r_9KOq9qSNV+RπU"q#TEr\0e/h\uioFAi84V\pnFK8GKtkU^(o3bEkzpKdK>l*0BBBbV21C=8>m]Yo+πU">RN[0RhxBpn3LTtk&-,KuE>/wT)TDavUGW2)%GG-bOg4ROX3Q?hgM*N%ak_NC^iπU"ZRJb8kR.j#S\1O/Q&%A(fmN_V>-bhs_oi<32ADHh[j<QNi_Gy3ul3cUTvy$yYvlπU"SDBN^$%tVd2xi)ziHrx&.5Tdxhu>302L=RD*an,i,qV(tv=T3H8vOG.r2^>?o,jπU"KHcP<X/LE41hRL977$D2%ZVT$k-V%KNVCm%[NTJXm:>d8Si?N'_Wg+OfD6SnY7-πU"#t2CQ;7W0..\)/3*pwQ34)Ly2I'03J+isx\Fa8]:)F;+f4j3w/eW<IUlfc&.[i,πU"wvq2-]Lb6YdJ;0n9.Yl+(vn<cIS$uNL'&q6nE0C&lAmupdmHiU7HF[K#tuMJu.aπU"0W%-[,%&(%3R)i9oKuA\5;a<<-M+6Sh>=U4E=Z4Tu2x-:Ls^NeW(,AxT8R=k%.nπU"*e?4:S/jE\g_8x%Apdjiz:e)/p5>V,+-BbeOO11;iB+&aMe=6KKac5_^:-<lY6%πU"t*$M=6HNqRa:Vo[qAr>+xJ1sdjU#U8u%2RL:W0+S3Wr+agSOk?;AA/Vk];w/'00πU"H0($6/DqQP[q]JSGrr7V-\)JfgA8PLsQ.L9fO.2v-TGmdvDDY-A/Bo)hf&XaKEbπU"e7qdGrx6;tSbm1x9>NRFoKc*S*oejpp,bSwB2ypx7#nr%?VjF_=2HNV<d>W1v$dπU"SFs0FH)p,jI*hsUJwP68N#D]D)yB$c3:j[?5Fc;KoQR+)bUJW53]jJH>iRx?+lBπU"VMJT(h>h/uvNkK(A\pW,',l[05f9+Jly,_G>2/Z^rRQET3[tci;Fn%v?:545K/PπU"a]qcZ%2Q9s0WUC*/(bgT)J]hXv\&(E\(z\DuM_U4AxFxCuvo_-xt4UGf-6Cb<C^πU"(2aB,9>r#ikZGY0PRFmWu+JB3%Q.2dtaHQD(&kDzOb0Gh.VA-aG'x(up%()9%%%πU"%-%2uIVEniP]G%]&%%%$+%%%,%%%%qiVS[ilnFkc:<<//-TR+3REf#+T5nm$qPAπU"?ffIpF,eOdF/us;.EwzohdY2BMKH_6WwWH^308I^96t(8ux,1Y*KqFy7+yF'eRnπU"tD#%$x)GeUodS7n6cOyN3GL-R_f2m#]uP^I022I^_J/q)QX?nP68.zh$*\Bg/a#πU"ES9wZIa9#*,tgI#7'6rfe?J[\jjuL>X>f6NeTRkKe/sP+GX=pCGvEBaFEYH>XQ(πU"6SdOl+nWu'cJS##VH&c<SMH=mxYHO_hfSY;kAD?jr:tysy;n$g^X$-Gwm3zd4rLπU"pHnc3O^(odDH2qHug2Rrzc([m^Bpt+$u,_xMl%kBt>E:ex+JV_X(U1i1NA*B'M,πU"N+<gls%EoZS,6bPF%p2h[PC)4\15<YUm?ElM[C>C9DJjB-CL<u%p()9%%%%-L%bπU"[)(Ec2A*OU%%(%j&%%%/%%%%gwn%hpVS#iln4au:2=%U-pdsqIfsK5./e+3IZa)πU"+t0=;7sqhW)[:Hc(X=pNj[Bg[>KyFI9&TYAW88KZc]Mn'=9^2mO]W3f.0>s=*:cπU"x'glG+&QlB5?TaDBdkX:H=B&;OLt>clAfq%5D#-;,S5;Wf<8RcO>4V&w=V=po4,πU"En1SL$Qfu5'Ti%,up(%)9%%#%-%y)JVEjmd9)d%%%%P%)%%,%%%%q%iWSiRln>aπU"(V=)V#-jl%e]529;<i6v3C+0$*g_8rW,TH$&zi/EI#x;sgr$ScX&xHKZDwuGLd]πU"fvZ0\n7W8+iVgzN'kifK>3Ne]JfN$(+Y''KXpn0nE0iT30jIk>OT'%H+g7E7Kb8πU"_jP+8t%;.i/hKSo?=Y5V9RaIG6JW\(Vxb]lHnrDLp9--G9&Q\lCt1D^C-9WuW:ZπU".U^ur3&\;Q?cA6<HOxUJhkH;Zb&.$4Z-BRGdAB_$uXX[Ako7^s6ou]cC.^k,Qu<πU"gPnt]NnlB[r8>Ie4)ROJWm-meYkA_2Lm-GzvxL%&up(%)9%%[%-%q_JVE[Q3YRXπU"[%%%D%'%%,%%%%q%iXSimln&J9:2;UR1*IWO:)2J4#?/2P=WPXYIBZZ(V'*..\3πU"QCavkT(Foe]<5.HJNP^Lt+/ZquSd/tUwLq:x(a$hV0f/dh3C^Ez+I&80w)yJ1vYπU"x?5<M+zEP/0yt=-SQtzpdL#nl%8Ld3^G=1fgodJk^XM='vhu<$vL7+\S+YtVL&vπU"6)(k\u%p()9%%%%-O%;OVmE'5%&kS&%%%$+%%%,%%%%wiV%SilnE6cv=B<U-UIHπU"CKR9>/q'PHX0EP\6#W4cee$$>s&/(8;_ZDzuf*&XTd]uvLknhH*eP?m*5R3rnQJπU"<(7OXfQcG'[BV]OFr[>:AeW15IS%Rs%9'_K_gOs+/y%S5H6MUP&Pk3fjHEO6a[;πU"WH:85b,.a%X%Y$957%-e)w-aDE'CG57W0s;U:_7b5:M(P+IPfIm+(:3ev''i:n'πU"+wtw(hjm$FV3fu8$%2SFpQS$P#+a#tA[IndA&gHIw$R5Qgk='=3wuqtu,MruXHRπU"ghLZhI&24Tc>ZaZYAhDclnL4Gh$jmNWolxwu5dl*EZjp,An?hw2nbko<#qiZ:.9πU"_qP:tUlenc^N2R?(B,<N&d^Dz:IiQC((5%tywtVCbdTQMd2R'l\up%()9%%%%-%πU"1>PVE[=xsY'\%%%%P)%%%,%%%%wiWS[iln>eaV=<%U1j2JplW7qa-4]IkBJTb;xπU"52\_<43#qtvo+I&m?\1I-IHo<+mnWtcDZOpPD>iWXchv^8w,4JDO'8QAySPsDANπU"S4cC%LIn?s1NCT/uwHx^:6z.JqnX[?:G=gFG:C-7M:oOQ&o90-/[?1Z9i+)OfZ=πU"6RF:';pCM=O=$H&\E.hqZ24>M1W64a<IQ(Vn4$ph?\v_l(piUl7ThvGelFHW7R<πU"9<-&I\#3],Zs2uiF8]k+SFAr7wwqfL(6eHldBW6r0z&Ql-ZVnP.KD?wm>8p_CFxπU"&sDup%()9%%%%-%2CPVE/6Y,z&[%%%'D'%%%,%%%%wiXS[iln&,$*2h%F1ivn%-πU"Yl#[>H:Gsl5(Ba\9vK8puWm9(w>:TrHZ6H+]8=,XH$>tvom'HI<z1<x+y]wtRI?πU"g'Oy.$yp$&8'M&\Egu5aK#2F3-e<PFj:fPJkNB>u=mbUOHGH=XUuG&ipjSxTAj)πU"mkH]*_Em6DIhmf0IR,>EsLk.-L9XzxQ,Zn(u%p()9%%%%-L%;HVsETJ\)7X'%+%πU",:%%%,%%%%ifV%SilnWffJ$AkU1U:\I13+3?[23e%c[ck_C'2dccg3kahm$83>hπU"1'U2K\BXfU?*/jLY2t$.ZoH(^uTf$tWh>X>T\:x4L1&+#=aW8s]]XeGo2Y_es:-πU"(^<NmSbhf]);tv$EWC*_3kZH?=NOYN_9>9<d^fP+0r:qXtl0[mSXD&R910rpwlgπU"S4<0p+xB8HYANC4o9rA:6H2\9Kl&$[S2w:NaM^sbGnHm&]/#6^Y&I<I*HlefY'#πU"YGc17r0[?A$7Jw:bOK)A8=1S<8jQZx>243+.D[VE(QI3[B7qyD=&(k2f86CmCRIπU"f)/3URi=$D,Xud(FcV9_m(V#x1rr+3>H?Rap9B#=#fdbtOB$+:]n0n>H8Z]))gDπU"%jW*:1ZpO)h[2p;+1o)g:(^Ie3:z/1B$c2;..k*8AA*N-A6vkNeUZPVeh3=T4lQπU"Fos,irg:P-MkQ+,8KYT^I:IRCn?9=/'GP)N-cn\8B&lY1%^55S:YtVr&V35+*y2πU",$-DDNATJ<9rsq,NbE^l%2z(lY-2blAn%eaqf'['dTB)a$p_.g0DywlUde:<b)0πU"^qQjl.;G>b[Z6'8CiTGFb=[&+dfprzu2s7ZzKg:<:_d?$.kZ>d8uXhw5YjL2GIoπU"%.-ur#\goH$2NT3zc$<OnplGLWrzQo.>=jxid2sdcCtBPQRgpzN\[PeP,%bHAOvπU"9>Qf=rV.EE4Knj>1Oo,sUpB2em\Pl3[Bs#$;rn)01_6d0_5D=H/X4M$??toL&?^πU"=l;HV_h/_<Hce:NkwRbVi$f^L,ok^sx^J+S9Z=:,v9Bmg8i)HgJCXYLi[66kZ.NπU"8+[&t+jH\%Tup(%)9%%[%-%\_HVEsPcUlS#&%%B%2%%,%%%%i%fWSi7lnfz<D<<πU"U[1r,aB&zj=&_2_o>Va>\QgIXANZPBC8d'^l5a&cRAQ%fBci,HJi]Rmrsnknr8#πU"]5d97c5BM-E+TQ+\eGEW#:mow>uLQ]7CRn&TtVl;7j$%WEH7ESyD%2zPHZJg.W_πU"%O586mUzTmjk'5a>T=%#kOJ/.TEUDFC/.zw$JO9<O_tCp^.t%a:2tI1#ATrw8swπU"vY1HU>ikz8xk3\gbgazfyD.R7qs4(mrsC29gXNYk*Pj/G)m(Wmck^./9<N^+?86πU"PBmLP)9-JD_[+MP)<)ZF_J;JfW9s$Nfq*))XiiYD9v.lJXS-7A:Ukn&*vwv$aVeπU"IM)u6qJBRQeVX]agAPqYhA_qYhS_nmGq+q5TR.VEh7Ch-r1m[?1Uw)WH=g5nnVuπU"(dbsq,OxPlb7LpKi-w00fYI-tpF:\TC**mYIHMTuE/%DxQwzSsbNoony0Dto8K[πU"Q8NLdJ0Yn[o#-AcQdG5XG+nT#A.M$=DXfBF)O>up%()9%%%%-%1bIVEMncVD'(%πU"%%'l,%%%,%%%%ifXS[iln^ba:2;#U1jBN\YS2c(??Eo:g]c.^=P:4OZ>P#2&O#*πU"apNd1wl)dItd=vftZt#<ZeGn7+:hpnHuJO_D)hsb,wH?B,;y4Y4JUY7^ZtLB/?xπU"ZQbZDu(6X5ZT/8&X9/ui^+-agw[f&U\Z*Q;ud*Y.jGE:./LRgQ(3To*uXtM2*-9πU"Wb,)K2HFZ'S2#lxA,Vp<68]$w3T]$/XS]ZG8_u'FM4O<Wf]T'm)up%()9%%%%-%πEND SUBπSUB V4πU")_8iECgOdF&b%%%&j&%%%/%%%%gwnh%pWSiIlnD^'F2gVC1Rp5Leyi]*?$JW%-(πU"UpTog;E-Spe'uphd>V].0Jq:^D,_,jr,>k1)nZ5<<AGG1l_oi,4n9Zy=I)T^VepπU"pZ+p'Mncy&un$meQN+*#99PW8$5f>=Ss/<3^8.%l%b6NJ'bKjT?KoW\rlZsWVRWπU"6juZiV0_,\?'Wjo'uBuaZixI7wjStrA%#up(%)9%%%%-%A\uiEcVk00.%(%%8%GπU"%%1%%%%q%ngwf(w(WS[ilnffS$]T[U5+Y&Th-72oQT7G6TyU)Kp%N;BQ*xTqI3ZπU")*D_y&O1No4A7x,T4q*Pd<#Nr/6iiwuoh(XRDDf^Nh.MM\K;TqCQ,uLJeROyCUPπU"e0#g/jX&(MnM8pE*-*^WzMCjO;y0hjY%AT-hw\oizxnXb=R\RSs9c\Z7PdX0T;8πU"S5C7awi5g$^?qi(6dz%3XEd7dWwo2^,Pji:5>,er?QpO&IaG)0$SPfdsI'P_xn?πU"WKAN1BS]=J1YYPdT+dNUkYW(rd+q:^h_QBc-'fSg[(Z$g5G,PZ<<TDT.Im7gq2lπU"XPV1gCHJsTmm1\fk>,KQE3s'Qte;rZ(V7&>lPjUy%rW<91AJ*%)-c/Ac#v&DBWWπU"+.v<=0L#WEd%K-le#9SX0AJU&nF3*9$Te7.4E?Iw>SPAJViu:=&+S<X6>rSqbPTπU"ziAY_e?e;9-Z1mW4f/5vB^9h?xa)Pgx-K[jW#B]8e,)^t-A%+sg7KL^\aB\SmGCπU"xk\=Zt&O(KAfZQbr,-fgvKy>9Kkb]%6mVGGPd3VL&Vfm0hADSJ0Ar-=j?&-92f6πU"T.<W=A^&M6\1]P'[1Mi19hZIiY_S<u5N,+FG#)>1q([W(DE%G_/,9V2(D8cjW9<πU"eXXf?Cxk:89pU:wg./%tv$-Ph;9c>BcdZC647\/Y8[7af?Je*JT-P:i[*.ev90VπU"57nm5\0JT>I+GTSBoMlW^6#jU,NF$-.088FGU5##)ZV\>3ksu.6\'LFZw=D4dz/πU"HxcKB9]Hih8E.7AF2h$QX^TZLs+];Z9*Ju5%WJ/,XGd/BQb_$z<vY+kR[bMEgW8πU"-7FqHY1jkQ^bPM(u5.K0:-#*7-579(i?-t=1jsoDny>Q)FDl*H?MdB:Ve7P_2M8πU"3:rHGvb]Y5]_Tik8=cpk5G=JleqF(02DCrGU<TwqhRvh1HQ?&X-=8O1X/S]0=O%πU"tWjjfQ\Ksi8/Sn;ye8^wKFeJ#8R-VeCU89;/Z7fo]38'k-Pi.+f[QK;;=3eDL[UπU"b(eGs)dOY6[87+VoBH=V7taP/m7td\81HjId:UmGRlw/?$,I8eay(dFmEgU0%7VπU"H$piqg-^WMV9L<1Z$6wnUb%gM+?'x%up%()9%%%%-%)7uiE0Q>I0&H(%%%8G%%%πU"0%%%%qngw.fw(S[ilnfQSH=k[U5,Y)W)9I73cIKZ2o-1D.ww^2LQPCSG7W4Q(UGπU"w#oB#Rr#Nj+-qO^IWS7<f&n,#huoh(XV>>F^\^TdXFc,<K'_SMdBl;eh&heEXpFπU"T%=FO]IcV_$QSbK=S][Ge0^(leGe+K;5oTAv^NK[1#Dbr,8ITpSjMM4p_h.5g-gπU"7/C;bCB-8K^i8:9KpxtSJS97m(f/8aH=<Q_Z*Yj;inLSY]UJUAJT):*Zn'bPekGπU"mG%6H?q^V]H72z5[5?XKdU+*$1.?GrMYAv-^w[,N)J</<VY,<ta&JV)u7M%11[gπU"5<)Bs8v1V]Te>6&Ggmm2#mOIT;X4L:d]O6:v)^HC'bFd$)9Hq?Er;j7zzAm+ImTπU"U&u<5fm%Q5[]lQ-8&$oq8K'A1Q%\2JOXfENq4-($oNMD\rIv9ThE[IguH9^OGFkπU"6e?[AMa<S$5LQrmq[+fX:M8)O'x-81I=aKl*oy*_+)[#($FXN^iPaHfGmGUx+P=πU"0tuJT_3rj:bz6-&gvKx=TMkbD1G_1k+'$B[L(-mIr7LM.5S*\?6,-*62API9^*8πU"\/O%8WE/+e;0#9rVZFn6Q?B:WM]FQ$B=IfKRw41[T0FPg3g;iFLia+CG=;5od=PπU"2tpY;#zWM1dp%4gHT(4(UW7l.?0<=.mITZsuG'(iLSw*s=v?:+e>.keX&P[$d%vπU";h=,W)CgWAr(t_m>.Tj'\))lBG55m8Np7W:X\>,.&:v]YF57n0j<UN&P[-08#dgπU"1HMB[;4>+W]srj8?,tOkuXf$Dy9k3wtdN?A_XL\kI]'%?G*8HL<tC2xS:M\1tF%πU"45:-I0[NC-Vu*'-VC:B6+XsV0a^5IcPd9EZ=]TL(<voE7^qQ6[[BEeq7w5:FmaVπU"=dbFsyF=55,$dOUuwuEFQ?8,>dfoaW^R.l^Qh/_<y#uVwUD+h1jDk(W4V-OK(:OπU"VUPY#d9ZSVjvVifaY0..$fW8JU&?]01>Sbpuiao&p[,OHo(9.s-4V=DovJ<KpV0πU"T8?.4B>A5K-%Pi'f8[I;;2=3ED:=x6](jC$&'#iq]+UaoCOFgM1'QPm1?O^[n&1πU"E:UO+$acsQU%*C.]yv*(55F-gH7V7H^=fEV8JKaU9<[s>\q\126Su71Yw&%up()πU"%9%%%d-%>'S(F1?+Whr(%%%\.%%%0%%%%wj%xytw%jSgfax.zJ,=ck58Ll[D%ksπU"GfodEO_&uFzP+6,nu2X\;lr0LU[t\*'*b$6&kipFEfIJ3u&.yz.ac#E^,u,,#DSπU"c_lXdtFG2hV/dhLCacf6IdF$ZFE-/E48w=swoWC<JqA0(dN8no?z+TY#5$6<HTYπU".[^xMlB0QGf&5*Q2&;2k?>KJYk_R.Y1<N/%&R>CIp%[^9Ll+3GDF]2a=56C#<\&πU"Ztk(\klR<OY,9Un:/.V>y1a7vbMT'j*o*,Qa:D;K^(QFk=/K_s*NG$q-E;9E_7_πU"q-/2[8tEAw*9a2J$be<X$1;SG3LW67aDdW/l_QD:8eW)YbX,ZHF)[r-7KGBX8S$πU"G[O/)1lL<AbzVSvf,3'(kQc^q9)+Y)Z=58itJQ>Cs)N9yQ,\Tv:SJQi?tP_Jyr,πU",#vBNTyc>VHYR7LneA)gW)D-0d]92Y8#KCK<[+m^j[(4,a'1AAnw<WHNfEbus7$πU"<Jr<I?KHG8J:<XV3_KK+kYtZu=G6g^b8_'*rR=2h/0_S-g#U18-;$]&(;%-Y70cπU":M+n2u+&7&41uE>l)?pf3RcinQgxkVJi^6H0(x]nDrO=Qn(QKO9m0T)Kv+AJZZ6πU";j:g*T-_2Uj.g/ZHHU5QQ>=pfl6T0xOiK'sDkdAERQ61/EGqIZAdL,R5Pj0om9]πU"WUZl:cEJ54D6'i#=64PQY=[5cFFVHiE+ZvTY>e%?vQ9O./zZ,ZLL?VfqT'AmWvrπU"]iJf4Y7V$8x]O%(MdmiKC4qrf8.tL9LU:CmB+[L4EmK/M^b694y-hp\p\Y:X?o(πU"J4\o'FgxLxF[Y>Dk+7/.;BrMei)SN_:/m.-e-B/awA6'GV)QfGTg]+.x#3kx=+BπU"o5s$gJ[bTx/?k0#aZE2NTHG2%/L;HU-*34a7PNsP7Z)p]*DR^vFOxFmn5^b6vh8πU",lS#CPn3P/\llAk:gLFKgQ(e^Ug>(AXD9PvrRk;EWvRwtp13U:h&;wN$NvpJJh,πU"\t,#^,QU7Ojb63h3oV-Hh'<HUI(XLijW]Y?m^UKhU2eAQb0[h-g31%A*J:44XrKπU"QD<HfMdn\BKdhX,C%:DQ6u?k:LVV=*BFup%()9%%%%-%6d._Ea\b\0%('%%'40%πU"%%1%%%%xpjq%jyts%SilnDter=B\U1TC^z+g/T.s#SU%pEl'JRmRebGk_8=V9M_πU"c+*#GJ,w\O=nuQ^^XNZk88.L%NMNlwsO)qShZ.CJsPR)8(WYeR<)WmwY;D^g>h/πU"nT:NNqrW^NE)Uk(#QQ[;8U3Q94bembr]w;N3j8:H(yTpSO3RWiA-ZFi-]<geUj=πU"3kQoVdl,<T;u4HXD:iswVflrUI-)_d;U44YJX01h\N>s7oaqqW,d5IoIxAOAHJ&πU"z1EXhY-%.N5l/65>7kjGreGWQ5':3o.<1)_uYE'YZcs;Yq)mG#YQ9,S;P,6djq$πU"BW'C:%<85\wp<[.h3.px8.3C;plOoifoWim9-N<Z0oNJ89\9=5$sC-/o0qo</nRπU"XoAc*_gFa'UlehxEEVh[DG(4n,J\?8;N)K-p])lPEqN03+\x^;]Ck1FtHPj.D'dπU"s]pdF;%'<wiOtxG1c^>:oGL5I=CL;3+b-hzn7T)r?:jFOVK#;gX*oK4i;xP[k_oπU"rd'SR\d5kDmciGc*RR^AxCI-p1?F%Tm^OVF0puWg0*?%SKyLnadPq=[G=L(5Nf-πU"0:M5(nJ2'>k.fUs<Z?15I;lnYpn0u%MZt=_(+,em12eecrhL3bRkmpm;s%R%hLtπU"+_Yc.VK9()vs2m&bPpA9)H85=0aRs?u+/tDu%p()9%%%%-U%D.%=F'N[(dX9%.%πU"\:%%%,%%%%jsW%SgfxK^b:FuS3+XW,%wRaoLx+Xp+*\;H30b_ZQFUc<d'RFrH\>πU"LuQ&XQF;u^?ld(kDa<b;mEIfR/FZ:*1085IEF[kr]*IKG:%l.dL2jR-ldm3ok8eπU"o*H4;vSt6XPq3m3Q<\w^j6?ZEb_kbLbgg+2.CZr)S1aN<>/%65_bS8$&MkB[obiπU"FVgcB^9lw6a0Qz*)Hzg3dmN<a%/ubeH[1pk'=]469:eEohMhr5)jVzm5Q-UT/<'πU"&?gpWAf$:D5I2P:\:+RJ5+r(.ep#T:O/.=6JSeU\S%:LOI1VTSBLLy#qs;<M\%iπU"HSWNC#e0LIH5as'cJOl#?hS&k[KrPL>#PT??\Tg+D\VI:&I?o8b%BkBYM4^CbLvπU"a=9lp1Jx9ka7f3rq?=BPM5fsis8kJxB,tcLKuR)L2($afipd):qKX<A#EuY0Ya=πU"M*PL:jNV07ULi))/xIXnzG67tOn8zLgAsCgC49pD)D,$m_-H6A0KkauYVRZr1jDπU"V/(lM+IGtrpAYW2JB/Dgrg#;/Y8d]M0:wS-+:OUQR<1^:/Ja-'6-x1\^arwu-q,πU";8n_O/,N:PwE3g#B'Y;aruw-q,SqVbrr4)&VpZUjK8DDiPHIPs>R]hFZMNbC>d5πU"h]VJdWesW[DT\$U1>FskA-f#7WE42lnmq8*8#>jG<a98J4gb.Swok*2+cT=F##4πU"iX(]>eA+=q,(A]behYVfWJop>4,FI(IUHsxk7cCJO$m6B%g7js?ouu/PLa^in<yπU"qDVlN7+3UJT7N9[6bX9_m3&KXhj)r%gZ7wBFTYpjMhhlmC5Et4ijMCDIQ(=:mZUπU"KKrGHVd$wj\uflTb16L/^/TPcmJ>/>p%\6[M(wf^2EDA/fWK>^,-=qlB0Ml78OUπU";TI#Wu],GDXo$uu8F)'\k7:L<[os2R$()[wiPwPpT1+i,$+hMBVs#->L5dpOJ#5πU"x)8<4jH_/WJQqFd\:]L'.Qw/W5/'/tw*QKf+jVoL8C)kuhbG<E0%V0WvO;e4tNMπU",9GA)aQ0=*fj)c&fI4QH+MQkTFuZ4uC/6GKM,TFr3AlN3q.o%8L'f.:1>GBQgY1πU"Q<XMQY89]kT50+lj*QW=18o[]^1V#yfT>#+.r(ElzGJ(UNmeNDN^[2[r.W:#TYhπU"lB7Suh>Br'O<?1V^5PcLi.;E2.$Vv#c,B7)Q8)U(lRH^RNAra]A.EX[X)O%618xπU"c#^1iR;oiG=nGk7oP*FxBb%e2#+\,X[/G]P9Mu?&WCz1[Q9uE=r^OvQY\\-aTMKπU"n;L7KMkz>_Wb.(PrwI.td<dVpf-%8oj.Le[P5QB_:l/ny*np38VmPXZQnres6xCπU"(gl^(YaI\t,1v7B$Sm*f-Hb.T]JkjKdRvT-mVg$,%du&j%#4Tup9oFOLlN<rLyTπU"AVrDld&ci[7^R2<>wN6b;)(3nJFSpQWZ:O?1NV/'aJ6)Vo^orEbYO32BgZ*(==rπU"cR%Qgavdve-Ak<k3uJjTsA4z9;63Q8x+d'$f+;etR'pMO<AQ,5Y)/a0?&CQEZoaπU";LwO'PGx4*y=gB)?4i/5V=[ZHUdep=(NOc9WG%qSI?:fH34BA;BsgY#pa_+BM3#πU"5be1Vbi$#qv+rd*s9SW<6&4TiZZCK'gL+036I%+U--e6(I&Tb+;%SqUGp11>>?=πU"_a58Qu2dHj%oAg9Vd%8*Jz7_Qpvo5YoGI]97oeM-h6T0[-E9Z*q+b_-B/WSK9HeπU"-)piZ_mT_,O(%6uPY&V^WGbET0V38%(:9T'/rqB5D&l89a^ZH(5+#5yaF++HzrRπU"v^nP4.5qo-Nh2B%yYQ#Pk9ZqOz'f_Ov'kf4u2Sc;CEq3BED]K(KQOrgr$xL#68>πU"[V.p0s;IP?U\WAdQfWTx+q\0a<K$*Pa-M(U,2<W6JDf*#6=:HB9;_3NzY_dfR'dπU"Pezp:wh&357xefNywoh&FrO_6:eqmFudL7MrP#+T;/9Nd#*i5[&3WIC,.x1%cX_πU"%V4YVn\[Q8_^e7U,ot/E_Z_hKiaF3+BJ07*[5uksI\yc7tk$1kDK0sZr(x9Y0l2πU"r;h*#alPm(d([L>IDep0XJU)\V<;Wh8dUg52+]7gh$>E?k*'4*;t$+*\L6W)Z/jπU"Tb.Z+4I=&c534u\)'\%.7W[A\GB_PV<h40g9QJHhCEvVDl>\m/Nt/NoL-onNqAnπU"j=Gq$lSJQUgabJW)Xj<Ze>PPsiW\o&];Pn(J,bC,yB5YrVIez-3%oX%jRn;)(I]πU")R$)KnSOFnd+-a=[j[%Z6MsJ4Dg%Lb:g=ovit0A5X8&Mrk08knj8r5oZds#EW#TπU"Y%6G9WO:*,TZ/\DVP6h8-Pd(#fo_<RS#KYHUk8Yr;7XL:=$:X$[oJk'1Z>Q7219πU"a=1pdfO0q9Abix-((^D<)1+pkiHE91)Vd#&-dmfk9Gf,&hw(<o5/02mq'$T(yKLπU"FGO>M#oF#MwN#oMV#o^5#)fFP]YWJ3&H%MgB[y,$xZXgHG\S8U3V%.SmhW+b4IHπU"furZW)ij3F10fgSaKPDUy-HJ*Od_5ex=2.HZqPJj;GBpQ,V\6b%H,X<-qv#%UVoπU"L'qfVJzeoV:P+^OUJs]JZl[SY\0Acw_S',KMDr[u.>o1HKd9Fr0n+)?>X'#U8AIπU"k0=uSFaXEhHUJb]=g-mGQmNZeK4h][1*OC<e;/Ni:[_h0qiG*Hpt?'#%I,cT^]=πU"A:(J(ot#c+c^f)oprJrBO3AEaa7Kr.qdaQ?9?-\:0F,=-\[o4/7kJ'9YaXmN^^YπU"]FWS)Gpi<j4b7[ULa_U<AtZidCp3'J.An3KH05\<=4)v(cG2QN?H:hK?5enFuJ4πU".-Vw-6X-:GzN\1uaA:Mi/d*9(GESj,L9FMHMTbG(h>bHWXl:Uj8GuDXHU25k)=)πU"4QIUyv,&Bb1'>9+K[a<KQ^TAz)UiP8o$UdRv5wX[j9Fh^ZO#.K9:k7L23JkSoH#πU"h3#oVe:B5k)]%efCo&dO=t'8e[4uj1cPSD8n%87>MRW\YeC)X<pfpACJd=Uu+p[πU"'x7AbHW(y72qF74'Y(k(>P$GCk#Fo4(%K.^HdRby1>^5^<FcJUVT40Ku?5?MommπU"rdP$ixqh7/5P0vZ7)*2fm*>M1%du(%oqg[QMbJ8Wfl/hP<R(?CeN4aF2G(YNs*fπU";5?w5geHZs<u_7YM2VY3x+4o;wb,SuMa5[j4K6FuClHjus#<7q;noY:=q$-o]QWπU"QM8M$-Tk]]F&6q.a$*OfIFBBac:Rnd\f]4S,bu%$takV9:Ww6DV:3<Wm=yoh:+aπU";d?]H2Kb.mj$QS7ELz_ASqbOz0sZgDWd-GUU66\UtGh+=UUg(d]8jNifh\=-5,2πU"C89F0mNiQqttj*h.fFTiBEjH5_WDicIkhUYBhnIcl'PkggOi<m6]Ts0A?>=#[wuπU"2%[[q>:5jT)d$Rc5t76)R^\eSZ3f*<APH\=O.sc1D\/.iY\LY$Vf^o<jN]mk42kπU"7_)coEtChV.Iyu$LM;o&xDW=C]qkdpF'TIEbajl-=qn-]'S3%jl:.P1CFtqWO<rπU"b[Se)3ph*aA7.<-egKI_bXzGYPP;98\Tnaq#*TQq&3'\9kjFH)\10i-yDhT-<[GπU"_0*hJ$tgnL27JFl=6Y1,)<N&^EvxHc$)RD%k;x]%rNEwr(*iRV];U3In18%PIUUπU"Ejadm*ar$=uV0Lf_wR5&#x^Agwuf&*$+nfZo#G#OlgrO_>T1lBe2GdxLkH6oG?,πU":u-fhrNogc;';Q]F/VmmZyq[S'3,SQ;X3Z#,\v#jSdx)J^XR8'K#(SLCT-a&J9bπU"P2bmDY]6oK6uCJmepqIo\lb^)vZuV5ua]JA(BJdk8ST=89[?Wgwq>s^COf*Jtl<πU"B-v<Tfabf5Zt<.DsYNDBED]^ahW-dRfZ7:HT/9KSW##:WvY:+>UQp3YqVf$:<>UπU".WJ?v9?95OqR&]/&Zfg/V-b:z2A29O_G,+(mZIi3j/W_:[#Z.5_pQL(_#1sOc]OπU"ptKM=Up4ULa$2/7qZO9RiD024UKe-h$(D4*WU(K0h6P#>cT)57g[d9N&cCWzIvDπU"$0MQ*/zoB)iw2zNOUQpanTu=_,<MU0N)=MX7(NcI_Yhj>yEZj9-YUYhpjYI42T%πU"u9m&&m*VwPgRYZ*jbYQrL4yeOK\FxBS:Z*/*/uKGxOBWdY]K<rk8u_=2i.0iaRrπU"jmEM($ZxHBWy4e.Zd7,7;\z]Z\Q*,0hXu_=>F/f*mfP6uqb5Lu/E-scG-dReok1πU">8,nhi]MD8+Pw57:3;b$GX+4BhtvR:JqxscK?zAcCX%qE&y>/,[s$KJ2Fk#+:iNπU"mvVQoM*?PFW5CG8#Fq8-w^MUsp[9#QuhJH<nw\Zt_<ACuskd*/B,N_Ge[J6NGUhπU"$V'2RweFAA(GjDYM3?z:zIqIqVe&KK+qhe2lR'zR6P/[b'Ff%DxWztcn.A=N3Y'πU":<AWnAi=UYQPwBW\dAir%>1;mLApWFti5=<l_H<=+-=RqNcCJO$cBUu-9EuN1FKπU"Fa++jL1zrN/sEc<&M1R:zeu2hZ:PQ1/Y*Z(^[%4:Uy_i%yu;HsWanKlZT)+rNfHπU"08<D*?0'[[<ktOu/?#y/<PAdZ3DY,Nbz3-LSAC+qM9uy9;CQGhJ%Riyh:CyGgh%πU"cF1yd\suS+]?<bmwQDYY/i8y/K^db4(J7fxNf=_4$FIPo7ymom$r^a3j$mqz$ahπU"[nV%1MlxNXBEvHWAYOh5iOP<1EZ/K;;MGEDHJPbGsW(.I'/S(tGR)2,1o_V-?tIπU"sSzf<tR4?-l1,<6fP&lo\JA^N[?U%(Cl*_5bu_FGF4#Om<=/Bt(bFj*GthK\VG?πU"/')<76tERY^$LL^BqIMl'm8ceeyk9E?sv;07J/]4#DS%g?7'.*-,.r7hwKdFk6nπU"$vP/j<J1*:lk*&n^U;K5,?MzbC%j.nDm?z]*65gpqV)n<$'h]k4vO[X''1Pj4upπU"HXiHkxcIt$k&BWlBibD=[mA-LB2g<C[6bdX?csF&8.uxW52ES#sepTB+GlTB*8fπU"=\(Buo(0Yk&j%ESoLixs':k+4oP29bpC<O8?FA$3shPu.ZwS_K(&EVK6h;^_gUuπU"$GZH&tI_5xMBA]$/Y.>4D9\r3Ill<d/;<&<S2B;El79N\.tYFGLK)A<TqfDe[r$πU"BX/=4Y7RXEMDV>?Xq^lU0nGcv]aGH,jcruLR5(pBqr.&2Zdhg*ACpjMWjHtprb2πU"esLB8[wcel#P'X:/VMA;ipFYd5/42cYXtHouq[Z*>6\wsV5YUNQ5NN-c4lIg:dVπU"N<FtJbh<vEr%NL26?,B0S0^-\hQoXUwOqu6[En=K<LhbG2m5d1F_?W_#O=Th41rπU"hV3-lCNlMbbdtJndi?53K%'0%4TST$R5MrnIt>N<UFV)&B#HT;)0gZ>u4DM3PmIπU"$-ZgXIi*oatux']oKL$&8mfFV:(nr*sSFA#QP0<&akmG10p?EwiGsO.EUPrIVa5πU"cU]G-=ehF9qr^%G#M2Ahi'd(UqwT;py:TnUQ:)ELZM%O.V]w,8a_.KxSYUJ,SpUπU"^BBw]D0Afqo;hAPGGA4LIxK%F%V6_SXVMu8U1,uf.>?.LbxiXGs;1B;2O[jQusCπU"RBPQ;[nbu9tlcjuI.1cXjFP>o-M9Oo)jLVbn#WJ#uSBdZ:-pgeA#,9Cl;QM^K3:πU"f)?lk*Yrn3aPMtD9KEh+t[J5L^S^%mcD&\Kr-U-0ZH3.PK-[c/^QeBll*ekrJIKπU"q'7HZc_h^e]l$d2(-<h:coo+;_]+)\iZrpB5YFQwk%6y9'SlNkNZUx9-=I174?LπU"<NFAu<j-/qh=UoU6f5H55i./f&A\,cWd6+wXhD%g^H55)1EpjmwNja=C.0)\;\RπU"T2&j#c0NmTc>E700;nr,<F=(J)UlPJ*wIP&CVa$QX1j5Q0&&i.AoN'%%ZeP&T-iπU"9i(+'n%IPG/,+(-8eKtq3iMC&^G+k<ynrmlGe6%A>7E(ZVKgxD9b_q4LDt):<S7πU"2hb3^xl2Pn2:Y#i>RDW=3]SD5H&cS4'$%K-qqH*=/:'q-h9X,Ogu*p?Px,TL6KCπU"WMkA+uEB=2LfVV-<K^<7Xq&:/WnW:)Nr7Yhq,j<p;bIDEe'b?JHn$x$>Ks0e#6,πU"^k:9F+Nn&I:-,+:d^b>p8VUelZ6iKL2<vIXJ,p+\4Ld8.ePWf6nzhho1dmet'&(πU"P&YHT0?rwpoAS<8qW0#l0*F0I]R_kN%K^z2sHBG9.%Fj_gkklJny_BZ/5tp*L2zπU"4e/_c*7+sk;&uEgm_a(ixrm6,r/SKKJ\?4i/FAjElK(dUuri.S;Y#J(HDn(^05-πU"QsJT]m#hMV9R&\OH7$/q&D_lpy6KWt(o7c/[Hz8kG'y&SGFIbZRXqx0Ude#9#VXπU"Qmd(pn/nf0dT]5FY*B>a%$v-q4\)^bruQeFIXd'&E6,=13I%VYTt1S5^Z[h/[joπU"id^4(fB]=&d'SjLEsJRqXGsLL\a;OPGUgX,DfDp]$0uAfN-H$k\k(>1ceN/m#2zπU"I-M5Y)1A9x+h*I97Pj*]eYJoiXS>Nv>hei9T(GFu&0AsjG5Sy1m?:XaEmScJ+E1πU"BW>sj+a(FYG7a*Mpc;1Lfv&]ogo(/CfJpjY)[6ow\z+M22g)%k0r&#ief&,9epdπU"+9c]*[6Pn_]YAm.Xor#gOm%..iCls&ivPF2]JIgM#H&I$<#6Ci:40r;#>m79WF*πU"Ebv&,vJ%y=*fdg*\]5+L<oMkD^;Ir^Xf>6)r&Nup(%)9%%%%-%M$/%Fl',.?e%%πU"%%k%%%%.%%%%q%nymW%SgfyJBu?Dloi&iqFB\^dwu?o#.+v/:FTY5%ld<*&vmb*πU".*DNl#<tdF#bbb_MCob2W)v,MLuwnQDv.m_%dT<%%up()%9%%%R-%_I/GE_$6U3πU"F'.%%Q/%%%.%%%%mz%rfsS[ilnfec$=U[e5i^&3'l0)?OJ>?d$g87]#ko7o1q-pπU"c$g[/z=?zfn1NDXZ]EPR0P'eeKQ%psY$PH[D44XpdNtmZnZDNBvPoc?4ZlVSe'fπU"5K##-F$+Ts'g(=G6gTto[YjH1ZW<x;t8c-mlDk3S4ki_HO[2Ue>?$-,#d>U8W1eπU">UdK$(nuf?<rKDl1z'<YB,l^9ud\a6KW-K$.n%3DkoTj0EA:l+r:s8fKoE,VvatπU"G7^iJksZ)6IA:,KDv_k<qVN<vkW,4Vs*ChVSc7VbS?ZeWT\Q+CX1Hqt*=9.dFn<πU"gP_FI%+3,UAD]PY6hO'(r/GDSs?0m*C;jc0=/,)parkEq+TjDqi_q(A'oD4Z\F_πU"EUptr5d_^^A^Q7*##+RO47cDa1%s*uheJno=JcM<r'J_\2An3q<HY_lNwacg)7QπU"^0%r0h:0FRXUph>fNYGDV=lj;6\X8U(U]*BvMWKqSWL,cODY&=>=0n-M?2WBkBLπU">,[54Q:t4$Y$k2G]LQhfwdoq8R,IS'1j7<^T(z^NHn<0S;B0CaX4a<CPT6P.q3PπU"EdUAG9Ef>D2pYJ#nTz/kM5^p7=pEbCK0-b1i4;G+a[Oq8Z#\nbSLtqIL:my^Qh,πU"7-V1npp+<&>rN.4EoeHNeBVJwZ-r,j8^Fca\Z'RrN/mC+YSqe4fjH(nzD4nrS6MπU"&JKSkJ<239>3<5+dn\?o,-8skD:zt+EBA?YL=#h+*R\]IucDtOr]wRut)Yq6cR)πU"a*IVbC9u]kABjuP?eZT7\Kt#I79kRs&GKuPKg]p>jKwA&pfvnx0YKvB:'8&up%(πU")9%%%%-%5k.%FOYxxB't.%%&XR%%%/%%%%xjqj%hySgRfxF)<dB[]+7xczKrDC;πU"T/KM3N$_;2rY=hCd&8w^FzYqEHcccG7e&P]Ie>6Ulupv0UJ;lg,zSqcqoe3Nl8gπU"%4IRP9^>V<j-rEIWMrhOV_k46OPE0kea0)I0pE;$i,+7'I?)a7o'KO9tC(htAw?πU"fbD?Q<dzF&u^BA>V(8/m^O8>MG$b)'ZUKgE<?dkHi/l*Ho<keQ8UQ(CeWsfcuYbπU"b5IpS/a8kXq7YE8H'5t.jX]<t.74&_PB5pF$/1)q+Fjj\ktK>M1f^K-Y^Zt4$5\πU";6qN%mUBiSS#-S+d\DXoaB5U<tJ5+rAlA8=>ZJ3HjS_N2Y?kHpk^+(kB?c#kEn'πU"ba)JZi]uUB(Xlm?0=#Z\:[>k88q9,>f-jq.1i:Z[mdP?XS?q1ZU^kL7fJ;XO47&πU"l0HKpU]c0Z;LN.'aO[6&%S6\:G/?IN4NSMoi=BnNqqKip[F4RC40^3M,.2e'Cj9πU"pI&-r>,w;<T(9+Dwms&6ii-U*6JV7gKQob0:NhG=gh6wOHKR^SZ9Zl.QrS2ROz]πU"+/eGsxPx-Gm%-_p;(VoWkTmjSWaCHBJR6.=II9h3]rYYmJqJeJ,D\mHI7y6DHA8πU"Erub[/YS3O7L_oHO:\2xtDQ<62dB8,,HVl:]X?4hDbRerR\/P4q8IZjAH?ls+lFπEND SUBπSUB V5πU":8[Pqch%bn0v6O;<DZw5eKnqrBP#-QgV?9.TcRQ=AaY.rMc^(_p1-6djIZF'/47πU"uNXs1+MP&D9Qpl5muO6^O]]X*Xxem1Mk;uS164]N90TU2?-7,yQ-6u1'k)d*OZ1πU".uh94z[^_()q--J,3SM=-A3A-AsFE$tAEthVOkDVPk,Oc3\NQN7sJiJFQB9[ZU0πU"u7.e%%1MP&N%%#,'%%qC'e?hdU=WBcR4tH*U,hr&<4?rN+P[ByYHaejqg,GnW,<πU"oQ^4,v$4;=kSRn7_NX)=_pM2'BWs4gUDrF6CU3rUeY+N*ud#XRCN5Ih_76PKTg,πU"V>aR[Upxu;)tk.w:Sy.3M<Fc1dCO\F#z\=43ETASkc)KgWvGo?.,CbM0>Y)GG?fπU"zg,Sl9LpII[^$lMC\RU&4<X]#Y8DbOTc'><f]868N9K<JS:1i%YY[#g)S\\W>a.πU"GFS5#O8gE\,/ZdOlJ_QDR\HG#m&CW'64<0V_=//d6K.:=W:(Et]O1Q_#Z60LOTBπU"-$4T'3-D)ug-pPN,%f>/OARf>]sK<UUlZr5Ff6RF-#sBj[jM-pG(qw</.eV$?.uπU"Pcee1KDM%S,f>./ORf^>]K<:A\jxDI9f,g_j5+_,;'^gxqOHEjx%rR/I1jLAq-]πU"API-;)cpE*trDaD5HC(l\)g-PTC#Kc]G[0r__4b00;OcemQF2,A=^+aFE)vU/Q9πU"[Sr<kv+=nLFX<j=2o<D&NZ3cbJ=>?P%rC+nTt)(f1&37a5roCFIc51MraR+<J9VπU"$J1q,u(]NS-yPe-7S^pViQFL?FjroZSCPkC%.m*3r)WeR8wr)G[:jSZ(/Z:c;5$πU"+tm'j7W*As<3l4b8WYwRQf_*i_(pu)gPN<cOEa><z&7jt$Y:BK:U:*[y-Kd;$R0πU"z^TH>G_y9i_^5(m09_=0,30UZ$wI_VbyfsOsHZCw=P%=THZ?0EJz*Mmq3fcKV*PπU"PkTd5mDIS?_c8VpGt3A&Q>/bWs<We<aKTr7Q#jb=;XISS(WTM^KD5'zqd*+9'H#πU"HO'bOoS1[T8^9H=Pc>1EpUmV'l-nHnKN->OuZl$&$VFM0K]3[WO#j>lC2:Z+F*^πU"PToerR<b_QRAj7GN2b+0F*Zzh1^fYh_MJ,-F6D9Y<D^s-eTFTXhS4e]7hu.0#;+πU"_?t*PD$qods6<xK2HwrTM4g\^_feY0EjrgF:LU+/DmC%g#o:=U\Dcm&#S$EULAdπU"LhOr=9Y0X(Io5#wZD6s(fWm3su%*#D]j;9^qrJjXUK<4(ucC,h[;qYhKCJ.],),πU"AaXA26+=ZhgfCwK'XlN<u_\m,Yg4>1[cCt']Wnp^EJX-Q=-KM4pCue4D+]xIFWiπU"cR$Cn:[d0t$dL##1,p:)]kV6nnADw=a/B[#GnIdG:Yr8YmEX^wvsr$^Q4,8(*bVπU"VO_z\#sFeKO3F[T];'W_^zH'^AN%wTXlYcQrS$$QkAGe9JNt01ciZA7M5LbS/#+πU";2R?X0iS0ckfCmuskHR3gklDBB5cD6wr/Z2=40fsp1^Egl]aiG^.4BYx.NT6ItbπU"S%jH&OJ-6Ml-]$2C_g=kZ*m&8kB/$_AoX:6mkiYdS8ylab^Srbqp_^t)f&rLn-LπU"Q.g6GBI/Om3wolv3jMU,r&oab+4S>jfh2n,^8DtX^/kvp;Mm6esfnLpa'$y8*8MπU"\EhF\fMOa7\;K#]+fuP1:1Bf*cO*=W+DgF#godl&wm:CUW-fu#w8ixO&ibF)+xrπU"&?BrS98jN943ac6osudmGF5GB7Y=7dKzH&V?J^-q-SmifX,vdfS6zvpf&0r?&&OπU"00R6z$scv0wdt8:6n?B,s$Jj?JhM*znpOD=c:fNI4VIiR>P:.-^)]'bHpR06&uNπU"+I)bqK_nWnmpUKtWjGD<1Dy2&Dl/W+dV1YPGrI#YN-D**Y]1KqaMgVQEHjYIf9nπU"V%CeJ>kGKU?V.C0kt30K5r#SG?_cS1?KhLerja$Pk4ee1:Q2B$:We5'PRGxDO/QπU"^n^30FKq/$&<.G.ZIf%H0fMBYdQcfI(95k8]3n+PmP>e9/)6/Gx\[>Ubd6492L(πU",[s+&)T>/kG9]nn]S*bK+J$lfU7f39%do/bH?3i8AcT?f+*^(T+//2IG#fo?YA5πU"+LZ*<aX9E7>2aT#HeyB>KO:qSFFN,n+WaQ?TaSAg:aR^KDqj2U_PR$[muQ*#e=4πU"xl2hCy/UQf/Gvi'F+OsNQ#iN'K1^3NVYd+/uN=8Hh8*sORUw5Itqs=3l4I>D(%hπU"HxX^-<\Y/ysaempkRi+WqTr8R^=.1sVj\jDL>i2A8$*jfMte)#Cf3ALDQ_bW60%πU"n[l65pP$>e1FJrd7^8VcZs:$/_*6Wa>Gif[Ywo4vIFW+k^e(30#PmU>qmAS8aIuπU"vY\#_^dx(q[EHd/^e46FKZ/Mou7gAb[eEm']#lq^trY?k1/)e2eMoa5q'x<Js_3πU"5c<e]/FvN;lfj+G6gq&SXc](rNP>]TW,(.(NafuKXu,Rv>GPXJ%SW0(+sq6*.uAπU"Ks<brCixgF.NK*u;^1:pW2CiZ['%PCPAu2L_u>2POe5?pxe,NsPKPFkb6>.d5$hπU"8Bym/Dl>yB$To((r,rh%qw+6t%Dup(%)9%%%%-%h)s)EOFxAN^#&%%Q%/%%,%%%πU"%j%qkSimlnfM7rw>Em1%Y[fGsv^jA],9FB<Z+_IX\\L&I961)ac%YPcGTnHd?#[πU"l/9s?nw*QtndL5sRHxq[P&AbJnB5?jThLXOF8u48bPh,V.T[tnS(km*6B3TFo9UπU"kB[B]vQSUo8hdr>.0D_NOtiD-^=Bw?D0ek.h2-D#z=mgghFS_A%Q^PD)]l?b%#=πU"(Le_dM>b5;56Bb/C6,I3VS&tHMW+r/E?*?1.?=Dj#q7#K/LL1=B'8\Q4^*)BMA6πU"S4sBSHtE2B8Ra.apCLfA#h]wVB-OCb%Vt_s:VEAAL8;;G<J$RE:79&]fVE1m(<bπU"V4[GQLUcW(oIu5;t[.2<Vv4Q[?U:?>Cp*v*S4futG0m&sb0V<jc'5,q<Hi(k3_qπU"\&nnn/q#g=adjP-\9l/ukaH2=+g\$Q(G$z^<N3Oks^8D)5N_Ru'*9.FJb'=c]DJπU"]J<B&V:P=1=s_gqB^?EX&urf;-%,IcEUrv>/]3BAve:1lt;eb_3(%44]>Vp->^1πU"Fmu%#up(%)9%%#%-%c*'(F7HAPeB%)%%k%2%%.%%%%n%sywt%SgfxNF%,^B[[9LπU"Fl[d+_pE,M[1G.<U1rVdeO)WCL%Q;v34>U=9)K=MpVZqp*.ltL7h$ch]N-N]6sUπU"Bd$GDAD+CF+PX#OXUG/JvWFb;G7c/cZp6tKUJfkV2Qi6m?6-/;C1ZOYE,qJ1(cKπU".nW#ho'Uw#>P+JD=PEy*PceIs_ras;QR,1ZnGS[3g84RrBu6?U1i:W9sYuz_Rb8πU"e2wW)mroU\]KX_]$kVbhVTEm%b.eSBeoSlj)OC&;J=33r1Seb_\>P:v4M]#-/FbπU"^YeBYMJp^QnQ=au,(g1'[V,p2CjH2cPePl:P's%=j=SkW)E46VYEZ3dI<Yq*BG5πU"0,OS)unSdMkhR+0uXfh8u9$(I87a<Pb&hB+DQIzmrJCYEbp:-lM#JRq2U;WbG-HπU"L#fZJ\dIZ5LP0.bPT$i8_a8C_;[&kR+;mYaH$,ooSGh\Gg1kJ;g.]+Yv;YJ_E<_πU"7EYaQ-gjulWPoTM<8/CJC2U2cA'$p#eGNs(<qp)NeO0R*/>Fb^,mgM/LmhCp*bWπU"bIOqFCLLl^WC)?9BpB<>gA7PI^I>n.a[-/*IKH%Iv9H6v/XgP,aDC,emI_z[$e2πU"1PJctNu3MhR3BE1&:cYf&p3L,z_-C3$zD1Dzggh,L$IJ27yo,wk'7?Wb?V9YHPBπU"\[3MQW\sh?esC]SnQ=YOk;X3k7V/Z2A.\9TpC;G4IB3TaGQe3e%F.=A+n-*GA-EπU"Y_QK#P4rVZJ9N.TGu9w1BKJD^3UTp]iO$g/kQ(&[k&N&BX[\V1c5;QT;\K)g[]&πU"$+;cFwq(Vs6ZZm/El#ZMH.B&gvSkddb_1Y]pBteAQg1W.,dqP/;UGIS1FRkj>o3πU"Ng/.&Z7h6qY9Q(8,\cB-xKDnHRNB]?>[f?uQJ0>:JOeZm*+:7,Z^dhAx(FW3Yk3πU"YXS8MK.Jj#bKS$Kr-.:H0=ocrnonf[8X1'W?1Va0J:r^WxF_Q6tX^C]/?+L33JOπU"40jLvqLXh*?K8;:k1rInaiv6(Xs/+,Jm?T^:P>mWB76b,+h+dUM7=*1j(mYK7;BπU">31YmAlR35s;Z'HiQ^=RD$NfP-qO\KG6u)8u<b+<B54G;/l<^;<N<=$QFJtb'MMπU"pZbWu2FeMd>T%Yri/KIldO:(4(#TtFxL?79iI+7AW*lsUle)P&A)TY9j=T*hFZrπU"2Yp6;-\5Yw\jIV%Kh;u5jJx6*l8#gk^%^P^bhNAvoga2^hN8P-C%V9<H&FV7<5rπU"[1OUS5g1dKS5:%JNN28n#\4AvIi=)e.t.tZS-.uK-2vJv0ZI+rWBF6UX7=+DR\iπU"%Qoy9lAB1>T._+r8YmRgLzw;xgI%ihixGS7qY_N:-2(1sC6'=fF7IyPnTF2xr(VπU"]?VWKaZbGjrCjXc8uR[C$U[l27X8IrsKSt]l4Xx%p*Sxb&u*3a9yk+1$dSVct>cπU"_syA=Z.n82iG;O3O3=O3oG?/,(w*u%p()9%%%%-U%q.%XF>3E)be-%%%wB%%%.%πU"%%%yny%qjSgRfxF(q,>[AL7L^c0xu1W+GaW6J<E_7&6J's2Qe/;/k$FCa#4(O==πU"TT[uBE8X)y=#U4[rian+9Z?0'_,zV,L3+,xSpT8U,H<kD)VooAa4c0F%>J[p&PgπU"a*)7:8).9h:M0]J7pUG?Ke1/gs%pvi%n.DDXzP*_)_S50\.].E9>'N<;KTIw'=nπU"Mj0sP[77T1[_Qi9TN*O-'sW1)Z^fq10i,>q%:)t-FxgYm?d%M;IW0mFKuBojW+aπU"m7w_7oC=4RgoZaO.Sohm^Wt/$kWAQ%&LETq'ZX<_niXT2ii488sSwCT7Z*VWOG/πU"^'hFcjufp9tZO]tCt7$%PQYP[cUG+,g&?va%73pZlR_4ipld>$H/N.&P'Rp60ciπU"6eY=HZqAMfi;grV.:<(_?yQh/\?Y+*qIr%^y+=Ggvv>S9ORPf]t&Ufr&v.K+lFcπU",Ymmt&hs]<kMqSLmKg'iVUiq$Up^HLO?q:chH)IG17c(FmOe5]:9[2m)mS-5iG(πU"AMhDd(*i+z>VNV(2g*Vq*(kW<DY<+b3CO=RohU2)Ronl2G,#fL#C-,:j[V/\F7bπU"RF[YP[IbDaEQnJqoP9q&NsJn7H7;R_$*/gkrQYxn+js3;szsw/F;nuj^:Pt;O.[πU"L-w]0Ah#X.w[HN,[D6QHK3+)KSssZYcmL1^M09Era9xvADJQ1+S'7P'?[<Z(7p7πU"74]p3,1h1RQd-#7Al0oevOY9inimO21+TMa+,IT;TlD0><mh&Py(H7#Y,f7P#-pπU"ec6lbIn1L8Bcpp.9Cy5i7MB3?Qb.h->*b.qfH<^;u#$'<CAY#,>\mSqQ(&a?>L\πU"7DojmIC<U/acfLsgn)vu^+<OS$dQN8SWFY($:7NVE5.$wW%D%pP]A^9EK,T?p]+πU"iSwIn:>=b>-lPGn4B+r;DncgZF0Rwmn-:Sfp:nm?&jE+S*Ge&Hq;32m1YP=i=L#πU";qRS/'ZO7_M+qc2'B-K=pV[bH?K_/+*.x=]LTp[m5KiNlr\9jGn.oV,k99\6$p_πU"zWY\l<idIiH$rfN=1w1M+Wj;aG:gRv1:8m8c*sTx(<;J\N6fBss+1nklOE^i8/iπU"D/Gl(U:Vkc_P<f,iJwd?&4KUOTd-1cluP5n/2z*QLI^em;R7_ZHEE#+Z6xouR]]πU"FoV:HIyH0[0p\y-d]n=1s0g<3VU?NAc2qoqNHNUT&xX8]=mK_FzhRF_vI>rJoMhπU"I5$td=2+Qfnaum&DvhR9qANIm*s$E#+sB.HH9vt8t1anu:Jr<YX8BNJL1>E(ZIiπU",E%VV][8SNL2]^7rdt>:MkpTxN+x*_q25ullfD]&R=U+sbfT)5MDPDTp;>\%N+YπU"RJq>u<*2SdPl5j]'oOpi15\b<6;9M+IZ47GIqGB:pq*ka-\G&Z3Jp.CM6grua3oπU"hCep$nwhrqq7/:0ZTZASi8x9u'\tr7.JeFyE3]Q:SaCvM[=kV%>R=lF:1W'M]Z8πU"CxVGhky/35F7$h$L;&TD'(f7R_GcW9/\%U6=f4w=tv;]i*hqW8BvI+QLXfr/<DBπU"Ce't0CU2<\,%h8.\X0]ZwDuMdw/tWg&E4\I)btbkgEq+^rljm)sN$bp^<MY:dIMπU"VQo0HdWom]$)A]p>jcbOJgKt*POqtG2RvzP&*BGDB]i6ZHR3rV<EMYmRBiN]s?IπU"7AN]U/dC5Z+5s)/uh?Bg&?ldyotYM&dPC]<A4KX=cf2dr9fUNoU2I3XWMnIT66BπU"pC&CPsE&J\jrZmNfl>h:#PdzDkCfep$C_YKefT8X)T^GlaMdmf&g]0,;G9h1u(,πU"f<c97Z#mUZftlb1;hY77Ph%%psJf4-AtdLhqj>3Mt3Gdxz?KVY&nMku62gRlF<\πU"^YTV5Re%p?xS+z1k2,re2NHv8Ld-PE4qk6:P9]ijZH8RNJ?;=>xmDNaXSMTY9PcπU"Ou0''.NMe>(c,6l1&)glOUpiZDfWRram;$]OM0*ZMW.A+L_:;4#Hp_$,[PAJ(ljπU"%(moE]]RH,O;lO$HXvPDTJfQ&JKVPB&qB9FhGbq6<J0YR2t5?#Q>PXBDqQlqmH?πU"OMkTZU_H?Gg(,G3_HpU/kk*FSJM9*K4ykLEb25PnRo=\R+whh^u\nbp1'8K)EDNπU"M0<5Z$pF-\hGuw<a[KNANKN-xd-dMTyv2t?Mu.dssR?;e&JVUCdz'H#=hj)myjPπU"yC1nd1EzG95e%]jx>(RuGC]KLSEX+.XLfZg?YA42:-%?ocL,hsXT5D]$r;nB\HOπU"+(Tn.5+bKTnt8Bx#Jnux+];\'D6#G+jBBT:Db[Xa]rKTrsBZfm,DD:(xEjj?VX0πU"6TtGlRbJ9QtXZ&w*U/1<p=%i)5rJGwNzdblW^P(bP(RDOK,O5I8Jbp%\6P7&Mb&πU"S_\tL:%O-8<YJBWTX,QRHVf)cU=pVx*NEEzMGA_*mF7L40'vVkQfD8bk,MpN-;9πU"=2pkJ'iU;UjtdkgkhOI]O)0f1xhsm%JCRFzLNU%;xJPrtK6:^_G+K]gP3a))619πU"Q-)+-jojf5Q*\pYiS4\Vq[*dIVmU,g9v1F*&_/3e9:T/5=,B:r:qAre%iHNKc94πU"EHu3ER1_jx9rlDT-gwDdCG*Ox^S[+bFZ+-Gmny<8tYzVVpm_b2V5p$>8\z?]8n#πU"sl0U.YJ[D&Jn,Je0pC&Tq#<dNAU+0Ty?iBsR:.TOQ;xeCEj_9Zt.z=GV-nI\lYUπU"=&f/9q)VI3hWE-9FotyjHxQfw.#[TA_:rBVi/Qr,?/NR=90HLgDhBJrq]qlV\rMπU"$R>cqg^Im\oGO;_9eSkq'='B:%^-*VGEVFg_sd[,y/k^.8ZVFAY.%up()%9%%%IπU"-%;pJeE<E<Yc_%7%%w'%%%.%%%%qn%ymWS[nht>e_VA=[U-jB(sEKXFS-z9Af^kπU"]h_5:'eqHxF61j#w2y0+7Ickal5;cOJ'u%F)<JbbaTX-kD^FIZtq5:/nCsWdJ:QπU".a4cBwvGW4P;4uT3'_FvxmDm\u194SE=ip]gK:i&)f;E8(ijCq&v0*imWJ85k.mπU"OV7J#,8$JW5L(nJPY2p8Y(aS*8ykLwSqZJ),7D9Q?E.MR*P/ym:D*OYS'QW*$,&πU"U[K&Z+#t14;lWt:fUm,Q\5eQ40ia=G4?THV8#:pOx6XPXtOKmJp.^c#ym?V\K+nπU"5*mE>2MxQ'Xup(%)9%%[%-%dDjVEGTO&,x%'%%0%W%%-%%%%q%nymS[ilnfTPp'πU"j[U9+Ydio0a2(SWunusg%+PbWWS5BVg4\K,y#Oc42##L*3WixCn)+1#mmc3HtutπU"PHLubkvm?f#BAp^A]A+6Rvhh[L0DbMQS-nd/$Lj/-eCGwqMs]0/,uIvGy#$_-]sπU"djMak1,[#Yt/?7vSODcvFyIO%-8Y%#Hd\r_h7[.S216[6Dmt:yqmdRtkq,/b?7hπU"p+sSB94We-:4N5Z/o$n8R42OaH;pMePpPm(aWEelt9a.BLr3u_K%e1+o9?<(pwDπU"(q6cMMapS-NL-/;+-'=rgYD.q=j/6Z_wS;>x:P=qxxd3\Otv1_NRmjP\xSFHVFJπU"+bUsZs%=m#*XXLTb*4WB8WV'P0[b8c^M%pqj+BoW%Bv69j8xt2Z'UfVqZF_9$V6πU"GY5R7c0QtNIgbf\bKq$wBD1u]s3p'Pr.csJVpZ]7XP(Vh#7?cEw]n5kH.fkH3/VπU"rU(bda_T;eu<GZD?$t;a(xHaCW(k7=hX^&teILK%N$tLGofmtgWpJYZf74P=jfcπU"9T^#nw:ptV7t0VsV2UE.uL6Y\Af=RPPSTfhWgE9Vafrbh*6RTs-N9xNXYYjrW-uπU"?]qKRiv7S1ug>'Yc_lPo/H9$1d:Ie8;;p*b^cQ]sti.>MKr=KES[/(9Q<U3Xw42πU"osT7Ns=gxuR>&8=RIZcV&BqWc.pJTJn,>YZXDKjanKwbBLoTaXHZiZWl*2N0)?(πU"GFp29i04'Hbb/rr9B7j_o8&h0q.qPU809J.]y81NiVRS-q(TJK]RR<k8-UX.tUhπU"]EL\F<YTH>g(VnPHPobc:,)/^p[GM7N.jvp9<p:lcG-nXrrkk:LM9G/bBX^]Uv$πU"ec&Nu$\M\IdCa*^rBiGZLk;anp,%up()%9%%%d-%d.S%F/k?;8[*7%%7A%%%0%%πU"%%tu%ynts%xSgfjx>(V,BS]5bNHqwAVB\leP^]*fu&SG.b5?7_u/XQ,8Sl&?;jMπU"=p+k-v9ht+QM20fQ4phGeUP88M>zV.*DL6aED;?DJ^x:%4<n:-e#\2s7GQI*0+-πU";9i.p5<f/C)#P1-s5yeu#4Ca6LC8Rk)V+>.Bg1gmWN5atr=xDU_jPWdTY_sW&ipπU"3NU^TS;q7a+:xB:S\N*'TKTkl+s*tNi5t.Zd#8]AEpgwC>6^8d.YUNF]4=v'5SIπU"ghafqk/e..BG).V07+VsuS];Pg6-W[^#n?=qJAYiVt4\d,5O,dWa9X-WIs)W'O8πU"*+kJ^E06^X/t:k&TTFY4faQU()0;i;x5=2q7KIr5/ipMF5=I$M/re]\I_?b_'c/πU"Bm#.bg;1]_Qq);MK#vtlr15s6A8U85F0eQK?XUCYarqD\G$0SiV]dP%0+d.Q#G_πU"GKr)p<f2FF.&l>Evh?-KE+EH<%\OXSVVv<[ni[l9,_ed72RZs=_(T3VI*hKY^ozπU"sO^8TX+l(K*:s0._rD4'on%x95vWc7[ZFz(kFZ=]fm+oi>t_;4Jc+2j,GLA#oLWπU"5HW:q3wSXlD5%$J;wCTA+58;*B+dWSu>9+,MkShJ&Q4J&aJ$6QJ6JaJrQ1JraJ$πU",QJl%)pnkS]nmi:I2X>m^xIS[n[$v_m6&K^?O_U$i3_-RbuUXS42Q+rr_n6ab8vπU"]VFme[OdbfHNw%PNHKla:J9P;#-k]frCxhw3kW;79u=.55AasfX<nHavg2R/0O.πU"j^M%w).k05JgJ2Mu,98;H&hGp6\^AR\Ab,^],T<N^O<^e5(s5^Lj?fK_DqkZL<&πU">mf0oTo$cMW8lgz0RS4qqF:A%hR26,JeY:Zhh26EU4]tCm,AVLXK8RaR\,d>:vMπU"4RE/,7ap^:qP)&2Ai?\n[ZjI23ICv&sT-gjY=F]u=1c5to<Q%kh:>\%7,ivm::$πU"IuCUlin3Z.EC8Y$Rv-(\+I2iDpW%l7<gs&A:S%;\$:+p5e$fX-2773>CLCq?*jWπU".OxDJi[K,HObbM?nW7Ok(npSksi4xt(CUq4ZFiEzE333ss.<3oHdBei[VJ%&LiWπU"(lk'AooOIP8sj/T_0A't=mROQ>b>ZvrkzMi24Gp2('-i^k^08sRu?>=wrHaGiX1πU"Pv2,SrTa]kXB,;pDyI*c3r6n%fwXc#f5R1t28en241Vm-b;XTwSz?8GOkupQ*(cπU"#Jg*NpUKqX4MVIquqoGTJ2UT)SdEsDn8P.5..H%At=lJRR7h*%ki$YG3m;.?]8MπU"fH-eWJkB*EtMm+2e>4.b$PY:8#q/vh(GpxTQ#SoB=fAa9_1h76u;<nNukmCnX0WπU"*Y:PJ&Zkg:dn^0ip6%$<5L8jKBF[e1Eslli0pT]#'bB$EIgTQoC>TmQZ]jA)?[jπU"5y2TaC4MqmR95(-QO<Ea2dC)kR%zRgE0QesLlRC-G,uX0CAH_%A&QV>[&PfKrNFπU"M3a9IY0D.FrwB9wq9lhdK$DY;l3Mv#b0WJvD3fcOs'ChtjjFf3i>1glQDubpfCbπU"1G=bl]ZtWrdU]XpeoF#/9tZ=CGX&3Yk.nii<h7j^hir2BMdj7heDj8VzY&h-e7HπU"bm*mQ2+Y/1ZR'X%r-Z8KO+/t4PwN]2/'z5m?OY>sgB-a[*K(;F;NWj=TAK<E3['πU"j#+FoC=ncE'M.Zz:rGil_eqniDGuX9)/**=xLWmx<8ffJrOE$KSfNsh+H6NJ(NEπU"6G>Ht/1I%VgmRZib^/1uIAFW%e2gp(-[6?/K<PiNu6SJAL7OuHikx&T3ZFJynTTπU"KmSftii0QBfRI53.YXs>WHP6V:R80RoF_Ke2%it67R)gEakRYlM8^)Q/Gu8.gu6πU"1R>o%ro-L#P**glN]ItCJANo+GfIc<nvjhHq,??xxLbnesrhnK\UT<brlYC]1%mπU"/k=\6sc.u%p()9%%%%-U%?/%FF?#()ua%%+%+&%%%0%%%%tuy%ntsx%Slfr)d_$πU"/'<U5i;JRhUew[Z%5^H_YTB>m>u]1Br%FGNGG%:5da$lk,FPo,E;^v+;(z(A+msπU"Qvm__wk;?>A_+2D:=DP1CT81/DLX4H/LU'k9MwJqqTg$>mI0a[SGvQl?S>AIsVGπU"c7*_rV.B&1cHVjYZ+tJH,/3P?O9W#<\Si9lhst+=uvOmD7zQda'6%up%()9%%%%πU"-%6;-_Ej+pW]'F%%%'l'%%%/%%%%wxqn%rjSiIlnLa7f3;eI-jX0Xn[O:3wJGsSπU"&C9\bXidM6O/a_l-5PrHY5DFZ,$^4j\Ti4rTx2e7dbZf=9b[%M5kWM08FqnU)]KπU"#g*YtX50>B(Gfqv&SV;c.P/<bQ&kjW>bzoO]Kr9bCA1DrTRP)r)c2(N,=Og6P0PπU">^sFAAaU[]gHEI4Y=HMyf'21/lWuEN7>I(xUtJ5.sjs<T+Qh;Q0G>seE4fm?vZ2πU"I)HdyWZ,Ce\*W=KT=Tt-Arn,ul<F.OV2puI*,lRx&*,du%p()9%%%%-L%ao^FE%πU"kZ')K'%(%Q/%%%.%%%%ijr%tsSimlnFN<D\UU71%I.3)vk'Ih%VO%#nfwR2&/TAπU"<m2tSZ%Z.WM6+JJ[3mP'nix7t4xrvWjG5Nuxnf$?\s(#R%wtiRJmsZ[HuZj?VPdπU"n,<:;AYC9=tIb<\'_4[1Q_HlZV57.9c1UV>RG#B(y8?>94lA59X2y:bUiCbftj,πU"'M$Ma5??*FmS0T$E:#K[7.F2:,g_nQ4GHGl_/?BbS>.qDj+Zt-ZHcn4*+a&m0JHπU"h*Tpr'kqz-0/rdDu\.<ZL>.?:S8)0\8s6YjW\k>L0X=)g68vG86'xQp>GZ^oILgπU"I4+lTMrspw9bn9*IS<ExVEt++jYku*=u(K]j^;)?I?Y4WIvPY?84jQ1BPawn##RπU"gxaXTdKjHD1]#vcX=rl^ytGf&WD]q<JjvGl'5F&4l^%[uFGXY3%F=i'P-x[(7+]πU"3g3$QbqhBc]lvNTbd]z[+a=5p,$TOC7.o6[?OZWRr3OJX[s]VgvEEt$H%bul3]jπU"S*$V%3QDdB\-;'ta,Ts,W4rG''RfFcOe>$RIim.t]^Mfr$A]Tu8pYuhJGtuq55]πU"qxz##G4[5Kn)=[)Bk-SRr/+O2T?gwRi\G1]NkQ:6ua[2ARx88]AKQRy[CaoYmYxπU"$^%83[z)kA63??D7pqg6ChnShc?N0T#=#Z]l^fV]#J+00AL8],gLV*b-D-5K<=HπU"JW(hq*^&\Q;fd$u-N._e1Dl8%up()%9%%%I-%kX#yEqG:&%.&.%%Q/%%%.%#%%iπU"&%fwkS[ilnf'M$wI[V1+Y[Fve]W9fR;by(fAU.c29=t+E(4s[jvZ.O<=3B^mn6AπU"qZ?PIUn4r2#lv$oM_vALrTNps.8r]:E'i+T6]3(E_82I4KW2sPSsHUF)Me,VHzuπU"fSMIT([-&47aUXqq33B:t:oDkmpcn5c()jHJ0zmDWHttX5f[l,=UVXrZ9kay8f.πU"pc+zd)Y1Ceko.n$+zZp3'-8/-&<?Uq:E+s.[HXaiU6a]b=r)QV<a7_Cnn#s]1KYπU"Ni]vX#&UG$D>ZIPBlFaD==[Dkr&jQNt$2wTWD+PtR$*q,?IrB7wD4XirOf,>QamπU"6]#MlE?l[(?iQjv?<Hc7_,-(bl9VL^QUlM;pW$KKhVVl\c#,1G8poW)X_SPHl:uπU"mEK%p&=d9^fx*BLp']/.]E).hpv4VG[kAPOHS&n>D3$+<#xo$sALaKkF#k'5)bsπU"GxL,kC,]]oh<UVwbd]iP)UzLW3ikdX-)Uy&OBBs*,GmnSbZI,CuP?LG$rvs&+htπU"\m/_qAxT5w\(U;E&yjY7L_W6&,IE/,Ynu5B'6Y#.gURs=mQ;jjx&%up()%9%%%#πU"-%P\RyEj_,UI4&.%%Q/%%%/%%%%xu%wnyj%SilnHfMr='<E5*q/6TNJkF<;9p-6πU"/,,_BGOwG-xd=$grd(xHR'0n1DpXWYukKXVZZro1K:2nx^d;O1FEH4m3r'S%m,8πU"Px<IL\L)LQg1wh$XT3X].l6:c]OaQ=lg21gw4ZC3w+eO+q6h;*YY6q5ZmAdbTP5πEND SUBπSUB V6πU"q7,>SYK=QJh(iwfFmG\tKkC2l6[+Nuk'7V9<6ysoncN^u6nCG]PfLTBQ<p#ypIcπU"7FtDrs>P%^ziu)l-/Ivb$dU,7'=(+E4ha08V5t)NncE<ED\Dljc>2uxZ*beOCGiπU"d0:$jrkz$_nXr;XapE4jD8vrO\,&#uK>^-u#:K#iNGdd;#yr(QU?6#]h1s^-GiTπU"u%p()9%%%%-R%;3_1E:nZ)m^&%(%b0%%%.%%.%q(x%nfSimlnFN<J#<Ed1+/srUπU"f8f#hS$G>_%Y6KQJZ8q$;J42Q_[uRUKPsG&$S6*A6I>ZRr7,Xh17.0WSp^PO6PBπU"9$xvZI4+=N4]q0lqEutk/#-7jJ2-;Ag,)v+j(^9-Q),sV%=hAf>'1'OYHKKcVCTπU"d)/se*ujc#h(;=oEzEBva:20)ziE2VEjD2[]H+Mr6.fTI+^\kY6.epN5c&iY*6%πU"m?_t=mm_&epS[w3B0&E1fYqGEpoMP1YQig^4en[-N/9/hsu7k5_mWrne?>;k+)VπU"[fK16?LGVS.lKUW5q#c8C>w[6^z2Wer2f+Z)Np)YdQH>Chc3_CUQ6BDbCBm^πU"Z(A7,cvb&';iQiD%w1Nit\v[0%ps%e\)7p]OT-#NQ^bM35tdY&%nX2fl[vNDUY_πU"WPSTB.np6:Sg<5Tr.<gxRD?a*<o&IJ9r1a?;Jk]DH<&B^SkSrKV7)w79BHpM(a]πU"a4l^vAeCCRX$W$09+u]P92O9$0IXTF2&Q9_.<XM<xQ%dup(%)9%%#%-%H$.%F%.πU"Uw3d#)%%5%1%%1%%%%k%nsnx%mjiS[gfx>h%<>[7k5wC4Nx0i/B/w)&0#77A,O6πU"?(S%BePgmInDy\b6l%qTSTd5wLb6O[:-9.zzIN;1miVlH_lRjIeT*^+VJB8kv7$πU"=?f[IIg,DDIWi%ccsLoYaI[F=+I^Xbf%,+%6'k^*I:a>&Y+'&&:=yHY3')qFZ/UπU"NSe+2VEh#w>lfD>A2M[nRodo.CFI,-%p9F^Fj[R)U:EB%$vx>x.L/d)Z5hmV&>YπU"9cUF$K.?qC:V]7ng-j7rnoa81pE/sk-/'aQM-/.VLfF;$LpnVV\v*1'imnyxZ+pπU"60Y#j6?ai+OB'>7IV:Z)Yd'G2\ac\'21Ua$U4Iu?9^kNVo&9wae('veRu1OJY)IπU"0>[;m/&B=5mdy6;nfK?tf,doUOE=&18ENBZf5z>%To&vSW:f$OGL1&1T/KTKOm=πU"^e4M;w/PFprAc6rC#xu=q_ma)9>FCrB'ii:R$fN9\AS;*71f-%xF_AmDYG-J/KKπU"jY4<IZ3P&Z2up,8l57=jmi#ggItt58%5plK'bkv0K>'KLgpA%r('1R[P_^0We#mπU"i7Avn)APX]qA.a<Xj7Khe%)'#Kv2G_K,166:qCXEs$+o72N6-KLlTqX#[A^ikpaπU"0j7=(cTJA1&0auMA(SGUOSLI[=JV%VfP4SPtA2X1C;aa%*Tj6D4<Cw.5QSJOIUdπU"T_Z+K2$8c>^fieu2B$HQb.-$l3,TU04r&q=p'L^uIQ#UQE(.ZN=[?Tu:kvoE*PgπU"*vrHZ;)\hyI(Es%E_OA3&2BY5RLvLT5r[jBSEN)VY>sK-7HUVkVL7-vg2qcEX<>πU"gYJxJYJ;xq<&&PJfGc'H2-lmdk)Ho'6#v7bb)0SAEt?fIS,5wn8QATYD6oWK5L)πU";8u%B(_o0Xqu%0Y?\QiNk[#z\Ps0akj]VZ3^2[[pVDFe90=7eK=AoDEGDi#I^mHπU"/?^IC=)87K1NIP9E_HG_:?LW3v-?;*<TZGG6oD*8^eLcs[NWs<V=0*sd5GfUiGUπU"kM4m1VZ\&t2'6?;4<_sQvk<nHTWBPTd.ON^m[aVB\.PG/m^34ep=l][D]BP+.,#πU"lCABl02N+#G.YTDO-)1\?6t_V2jWZ_NR1lw7)Oh\C=/n19M4&Nx\,aJ]P3t$UXLπU"O3XalH0R+MhUzMdDqx>&$>7UQ?7L/Ao\y%N,ZCtj;eDW>r-P*<Mp-YJ7A,RSY:RπU"'I<]xPB30sfZ<K2':h6>f,u(WCsk-sFOfWS:V5hV6t+0k[+B-spy3s<g^Q_[GLYπU"62%]#JIV3Zc\['PhtRi[mSvv37l^g198%$<]JS:l#4E>6*\uiK<*7k28o&(-^-bπU"_SnfLE#3488c#0[mS-je1;DE1DbSB?LqyNvtEdk4^Cu,EojGJ^8SfzDrk<k2[saπU"V*?'8%up%()9%%%%-%4x.%F/i&r+%](%%&Y1%%%0%%%%hnsj%rfVS[gfx6e%r>TπU"7]56#$iN=1CNInR'ADnO*e=5]UO1M$a'Tj3(l)?p&YNo5ubQwpRJjJ%T=pJRGKYπU"a$2>U^AkAa8iouAq)MKI'G>^9lB2ZkZpC2U+[%1=#UXVY?O8*(g1Nq5OBeLgvQTπU"GN1r)qZBhr$qXt+M$6NU^M'H)Y.Ek%;Pfg#JNHV-%I[vN/9ym3qbC:[7i#RKYfMπU"a\'GwCGU7P6AU,F$sAB[H9f.;)E2?Iz%'hJMPth'=LvXZB[?Fx1Hf#mU(wDngA4πU"-r2&eF87%<^tj\iX.pCmY/_aWDp.BAIj9B(WH#U?yfzQ9IO$(&2(Khez[efa.USπU"G[->:/2$s'IP44VT.BNEV+*TZ'[$w^C?TswSEpR08<l.B;*j-L/c;seMdZ'=&gIπU"QvNeY4'mGW0X(('s<5m$RXmwDLr6+XJRhtStA*D2jE+<iT1?9H(e7[']kdGisU+πU"W]A+>Y+O9+Nv0,>$AZ7%n+IK%N(r.(PY?0%.<9T1P-eX=S)]:LJyrwCD06?(7xNπU"S&Dtjf=hR*Z;aa%NL?ip;'Gvy5.^0R':nW$M/#rhN'*N,'FY$g,1)I.xI7rhe<#πU"c>E,AA5[\H..K*[-xw+XJOF_q-:YXF^[sc^FuW8EWwCM4b>38[7(1k4T'mm1W>TπU"i+KNN&'Ybv>[Ye-m#Gi7)uKL6HGQ^2EXR*SO^FFtMCC=/=:9Avm(W::KuYwJZ_:πU"m0?^:FJHUb3OYf>E.ZB5d>+:&E$J]OgYT^q',6i6.PlV&'NoP^cX=-1.)H%4:?\πU"6.-4=:iF7^5DP9H2/9/'#/Ap3:u2*[hpfUN*Q$tjEb':KQw_E3%/1NPGd'P8,50πU"B+P)PG$vJ*Du2$69[ud;:Lsk.ZrPvRUqRhx<ctx'w'r4+(^<-bx(v\b+kI;bo1?πU"KTdnHtUOjpKwm;=z?\Y9)Tyr7\cal/c1,Y=2&YHN%M=_zeYhu3T3^rF*a/Wg.lMπU"l1&jJja2=dTE[Hc]T_rFb;4Dk.a4Q<Zqb(5ul_RbTp;A4?k)jDUs6:hXyqb06_<πU"OHf>u+&kXs>N-hv+u%p()9%%%%-L%ch9jEwPp(./%%+%a(%%%-%%%%xpj&(SiljπU"nf$6(3OE1m+V'ed3r=oA$qALnAD==Qw97Ym$<aI,+a,ao$zC64CD%KI&G2q_WyhπU"+GO2e=WS$1kf$yxg[Spe(A<6Hj>)bW,7n%h8j$4e/XrIRs\^jTu<vQBE%Tup(%)πU"9%%[%-%eDeGEt)yRve#%%%j%&%%/%%%%g%wnhp%XSiljnF^*+29E5H=goIkeu(KπU"n5%O2+B+/wpm-X5Ao+<e>*p$'A=[yc8PoYjlKmhtoD++9Rp8KQBP>0NVtTNU&-uπU"p(%)9%%[%-%i)c)E?bW8?]#%%%Q%/%%/%%%%q%nqny%mSil=nfLr(3QU5qU0U3BπU"w[ko-$iQS:bS^t(s=G'4HLE/CB&?L8#&Bx5kMIdt.+%RcTVNd'0hv9o#aHJXLn$πU".*#>g=/*CXl=N.:6--?F:E\[=2<QbA>Vl)^Pt-59rOA7Nn/FxqKjt5J^J;o;EGXπU"8;SR#Nl8>P)hFLTVZGs>^I6jbM$RZT*9Y2Vot)+QuqvF3<4tlH>(Ka^UHHtGlE\πU"ulVqZi5hR\&fZNARY1ulm6YxhDt?)i*lI-#=6(d93fA7].7G-zQN$?:$&UhBY#NπU"js2MW:_Biy0CA.%bN%%up(%)9%%[%-%A_$[Db8A:dS#%%%*%%%%/%%%%h%zwxt%πU"wSil=nt4ODhPFSN:PPZm&&EEI99Oc2Xhh./_&qq&O1E23[R8X.I?seF&%&y%4/%πU"u%p()9%%%%-L%4b*FElt$*MU)%%%8G%%%.%%%%wtt%rVSimlnfR:b]d[75%Y*(gπU"w/EE:A;x;+skm)Jo%NUxx]4&C<Bf&V/53.^I6m;YqxwJ4CmmsQTuWri6=NuwlPXπU"q..8wHjtTNGM&GUfd,1vl5*MWn'X\frAi#i]_M6dl#\N[pZ1X$uS0ch([5vZ3oHπU".d=s%h=VZYj':7dZ[VUX5H%84.z1'2Ef;<2lK*[6[<0H8ujm%u_([dx8HBE-?rGπU"=M-T;\24%<?Ri'=7Z=]%J9+M:L'98Cvw#\^)7a17xpe#X<IQ^/c_pw%'GF)^YmFπU"9.[08;RoJ6C*K&465E-dJbkZwRZUbJ9#^L9?d'a04?CEYruT\*I[mMIUs0E<HaMπU"4;bYG5[j,UTA'/pI0<s\w47#m%LcZ[N<;(.G2N[IxJ9R6E,W22P*3OXUR4Y1jEXπU"JHOe<oC'U:(8Y4\='vUH3;Xh:RopEU-i?YJq(Sx20oNXQGCX#qHh.I5V-\P0MESπU"<KB[nKSU^gw_M(o/XA-pGZ'BBLvDw,lTcGJeTmbu-^u,=Ip*pHC?p.NhBc,)i/kπU"zm(m7n;396/Sc-\e*<]S'1B'%A89J#'3.kCvLWr=iLVN[&E$c&E8BzS+<54CfC=πU"*/e*S>B^)nW%]I_lGCW_+KVs?UohN6ZL)iEJToAZVT;rSjZr\3Y78$'X,B/cn7uπU"dR?a:,uh.HEeM'%v(.KIkCvZ=g+oW;6DofdJ7EdGL?w\<BL;B;(G;b.jGNFkYF5πU"7F.0<s-=F#Bt-7WH1jmW-^bQ]sflB>I]-18fF'&a[&fZCC(rIe$?]WF/j'a2'0EπU"QW8].jx(CZsLDSxvT'*uW0g#%/=Rw=g_l=r'I\58.4'ck<Y3We'o7XooxeluPI>πU"ER29NQ[)Y1Xyh%#f%:AZ4u]sA,CFC,fHMtOMcy;TbRRsRbG)Og-Q4Z</9Mxmn>uπU"B+Lf&V_3(eEB;5%R(D>fQ8TntqUlP6.'q>ZW_1xsSMBQMK&x5kUuTD_Z3?nvw(gπU"3V;X-4r9RJ[UP\sBJ+mM516$u8J/-'MvINMWn%G1d3U'T8uCS=q\GHbBWGgYrWQπU"U*pQ[3;Go1Rk'hzS#MEBneW*5#i%#<)KcXi+hJ()gBEj.otj+B-b;3,N;=bW01UπU"78<+Z#Q1RSzvV0Rhnd951'XU;VrR)fXzd6yra4&7qL%C<YS.S'P<=TPdMs[_m>6πU"lV/<JMp/zW#T#?M#SL0dcVirgo>h,#['86$8Y5fE\:oR0'U0AARvL;ZPw_2]+&cπU"i7*6gOJJTM1qiy=_hMuCVIr)L^mG5g&JV.jRBr1LsIE.h3#UI6g^eS_$ctbF;gGπU"0D$AS5Gp\11(4?,sIW\cO5%&O9)sgiR,L_x#qaKLIYp78ibOq#e=*Q<sxig**BXπU"lXwpDT6N5T-$j&jH#Lp%6npr)4Fo;D*SWl*+;<zD4aBHR7.;PH$[)q[DlS9-jI_πU"'RaNKP(X.pdcs.P]SAZn=1Pi'(WAZT8vW:TxON1NSGp^Xt8%up()%9%%%I-%:RnπU")Ei3+84T)%%%8G%%%0%%%%wt#trV.%VSilsnfRF)]R[5O%Yd9)#y)oWay$m+W)4πU"y5x#m]3s4G<LCPVyLy^N6NuVPs;v]-Q/38N>bJe]epdNvv?nndDu8xk$6PC1=mdπU"5d$t\nl?/i=>l0OYU\1l]'daCx8pMWLn:r(yx.gVZy*ZHts#V1L#'1y[Bn1yU*>πU"=OK_z/k7y)r?;;/5\Fz-HHRq+.LyZ%4EM^$788FqI.7r=KM-P\b24%CC(N&$)?/πU"A7.'(S64YYWE*M\k'RICEx4Ko\/G7eJtLsWgO#eU&\RP)a5FFGgW_wf3s0c9pl;πU"*7;=UKdFk;e5DV^FO7YF-VzyJQ\x^24p$5^mg0EK<zcmPZo'mojr<&C3m5kEIb#πU"NB(\.oeS5Cn^u*'3MU3ax^7/-Yq(S*9^RV?gdfX0jgqXHC+ST[0%U,l-a_U-m)BπU"^-JG5+u921%SXnuNC;<8Bbwq1(A78&iXp4sECZ;-VR563jXKd>6_B['*rm&a8nqπU"T_]*TNSCc>Ae5eWkph.l[aY7gT,LFqFg1ESNET-<8A)D'dwg^>C5\jhE)$H7$JuπU":NRl:>iBg3.O)wrEGjWlQ/EEW324p+Ou'-SHE0DE\GKJ>qB?OjeK,8A20t7SnRUπU"ZQ5#O.Z2^76$GX5D/-IQ98#a'>$.-Ipyww)5q$I2EbTRmxw-Ps.%8&Jri7cU8K1πU"^..aSQg]0y#j8iM;(/S5*512kjXP*-58PX-e1ed'?[$oZ(g;_31g#Wnu)'CWG0MπU"?d>j0J_>Ja>=nl=j'QfFK.E=^*]OGYpxlR5l=a3&w5'7=&^*\3^hA4S&whe1nY/πU"aiY';^-a*R8yJ=tG)-*1Om+O_:*SffIqQhqH6KvoVFRoiS&y.7J^.0EOw'raLBvπU"ywj*0fFW<\Xv21Q\jbwSea$F&P*]Z3IggMaTt=+G#gm&d&=cO^_C[/F0l*va7d?πU"&=O:bUT6YGBY:T]vyIq1W'yMFpeeul3t)%mP/\=[W=-uA+2hpZg,]XB^;&3Q-j%πU"]i(0&/Om1wLJ-ijklGh?9'h[(&K_;WlnL$4F0KggZ?CVt;;En_5&K)TD_^V^<]VπU"]JeNd9S,Gre2K50hGa)S8;H>k[B]scR?U67iG\?Qrx73amN9Rhb\xQcN-x',['8πU"OLxYW)j[5GUanWwO83:N8BVb%s<ZCw^KNHHVgy=5B7xcD>';7Sg<?mI:^w$u&qGπU"inDIR8mZj=LTEdvxS=kues%.K)g:AS]F(iUE0%mk]p'A/FT%K6Fg)%XPnLihW)aπU"l*^plvf=3W5i;(/GC=uSCY672%NnJpQqHo)p\]PA_=k(31bBTI.72Xa=,n5>bY;πU"r\13P4P\q$J3;:k7_0[C4DhSGu/8qQb)Gj]1aOu,=odH=f:I-x'%up()%9%%%I-πU"%tlJCE9g4p=u&%%%.5%%%/%%%%hn.sW.f%SilnZfND#&RU5+*Yd4c*]c(<9.%'&πU"3O4s(J]&#?14xW7TaF&3^Kz:[(NhzC8bAu4m(CqQb((Yoc#t#9cbrz639l3[REqπU"_q;t'ThOp1zz>4>,^jd&fqeGQ.=_QXT&Fca$*?^7oKNlzBNFM5MIaa44.5YQ)$4πU"_6$^=Cone3*9gVV,1S5CE;t)<P3d_e)#$rCUm9,DdyzHF2[/lgDr+Ce:i&NIw$-πU"aL3?3\QU9spdQ6RSo[/MEM(2+&[a=w7h^gu4\7ZQtGEphg6tQ:-cM'Q?VH\1JN(πU"Fk7ji\-lR];SNLp.Ivffg=TW/kj)W$H79_3)npf%M%3CMYa.Qg=#b316f0Y;nmMπU"KT7=*-+?)pdhc2K^[U3LkDZ#$[xHeCttd%7T[:0iH0ACFAO6bAu,J1.kz[5>KZEπU":L6=LDP&=Jr8D>6214R:X?6?74=OqdEcb+Lt%.1(*RrsZ0Jk)WWX0.wlW/ayLcPπU"vmLE1&(iKUrBw\YUhb*7]rX\KFrimaGOb$XDa7^BixM-_n3nLP^u%mUCH]^'l.uπU"p%()9%%%%-%1/f9Ed<,U0&)%%%'t(%%%/%%%%utyn%tsSimlnfJ0*/OUR1)IWnTπU"#4sm.l8??VJhDA,*#j?RU[GmCFL\X-]UEN,2-vH>w=OD)zIL4nKx+<X_i6RM5&hπU"IjNrf_KuBo)_;qM+'WYTC2hCYgfdNc,NxuS%up()%9%%%d-%_.A%Fdl)1cG+7%%πU"d=%%%-%%%%rf%uVSgRfx&';<>Sm+5wCNWx0=tq9_aBrdF$M[4+#)A91W=4hgj0oπU"7)>:q$p6_ZXXgIcPq:46JjPBME5n6\5a$4cQ+L'ubT)w#_+P#hb<GS7L,1B)-.:πU"zS=7g5t8qs-0XC:odP>vtrfB<ugGK<+OsK,cn5]76nO#d:7X<G)DIKcQEnE-.$oπU"*UL(YK(Xq]hHPP&P&br^1*mS/b#34;%bD8VB3>;4QA*&X0W<I9Sw+QI1oB-:Y'7πU"8AN#k[^]GaE:^hSV=yg'RvA7Lq/E=w1ZYEZ_zH9?$Q76wY)%+#7sksjh65NY\t&πU";%=Nw+\$qv^<>ab\TipjZ8?6aP.Up',g)Lw7q;mq\.A0POWi=pLu7Xo8i6=2(7EπU"hq($tzd5ijJ;-tEZe15$5Na5CiV8e5&B#t\m%;h5rid/P5sasOIAvLO9Pr+;S^tπU"R%nD:iISm+_W2oMe213c6GWRE4_Rk2nF*GNqaPAM+gv1rE-?sO\Ts>>'64TqR'BπU";>jI[o;c8:n34$\G:7%kNnJ#s=['ptKToI%nF/9Rx#0?9um\UN%D(ii4CxBUG-eπU"#EHY;:PL/(t(b\nCD^JgCE\G]Jq2:yLjGK=4vHb<K/wc\u3c5+humS#=xEOGjhKπU"j-u$^E[<syMuZsftSB-4?#NO>w_].7G3JHDoLqV_UHaBP+#$t1dU*96=1ugYWoLπU"QqqLJ6BgPOX:^wrQe'(+E(&+qHR$A6-dG[0UG0)dm=M3.:22)&aUA&&m>tTq)7QπU"[2;O62E%e);7MF%kRon(^LevIS3n1<^$wtv.GWN7%rdh3[2P9?<V_=-Gk(.xrJXπU"ylJeY1pJgzs9U2(3oKM>$yA_N$F/7^Q$NdhoZ8gzbi4Lwm&s^[JP^Jhj9rK,wm*πU"Ms%L,=sE9+:.z=$5'r3\p4%wkGj\r;S's:C*&tdMVgYQ%TCrbsZ,mg/ri&*3b;HπU"G>Rr/,?&o;OV&:5hWpX,s)rs#S9S65Ae?;:;_*)&E/(il#aJ?(s&I1%%.+(1JELπU"H9XRns)qP'S3WH-HW)y:nMkDej+&Hlt'#XeOX46Yce9,DgUt7s%:Uo91X2ZaV)qπU"XYk<=+a,'bALQ;F<efem<Z<gf?p&3*utY,v>cm%,(a2]VUN#>vv[0MXL/#DQ^<BπU"v63iS?EJ9pI69n_b?Hr<D?7Tbd-P?e\<j=5#nUXm)5>^2VG9%dn?BCtleTYWA\CπU"Ju2^dB/uMlsQ<Jr+=:WbsXQA$3Q8_pNRKHvSr6AW;=2K$:9lewpiEZ-uWj#Z-orπU"VJR<K[(k%Tsk+6Cod^P;I/#B?xi75mw&\VIMDs.&wF1-Cp5BJ-qA7WYclr)(sr4πU"cQcAk$aHC%B6O-do,RK/R&d=]=W'fAu<=AeLLRCC=[/OfWfop#Eu.P,q)5u%>&.πU"BA(_#CF,:^sm/)cAlLRol,00I/SXB^C+[a1h)8xLIDy,A9I43T?0aoBj(FxP3/xπU"Z]GnZMBmr;7]*VC<J(WOaD;DAV\A2^sYmYs'-T+QDBAAA43PjC/q?<<dD=%olAoπU",n[uW43.4LCN),VWO6(%<[w]oedSB]BsCAH^AdWPg_AtnNCde#s-F2Kg_i]Otv$πU")$Yp-MdlWJCm[cblG*/$E[SF[6rjddLs3,w4<UjxrHd=B,#)7<_i;u%AuiR(#7IπU"=usIRhU8VMV,AW,EE9Q2A8;jh1k66Po+2^A.q?Hd-x_u8JMV2R?%k_bwGu)4o'1πU"\GzDP$+ewZ-XgdSYpfH.'t0Yo.UJD>2U&z-E;^Zc/kv;^WO;Kam?&&UH;ZNl0ZPπU"B[:X7oP5QMl](Ue86;GaxA6R/wYt4#*4tq0<Hiou\L#f;RJvmWAW:3Q,i;417b>πU"Zm$g##d=6zjzYn&:o&i7,^qSCQj0HsbFjm8TFH8Z4lw<C*^,aoXLHxX-AxNZqo4πU"hV(//La:vU[KZ&d,F/3:[<pa(#Zhu\'uDL+&8:pvC],6,0MUZn/Gc/gxRB16TJEπU"8'eI0;849t=K37T_2:w&JxYR<nrx%%up()%9%%%[-%I0/%Ft+:byn'%%%/-%%%1πU"%%%%ht(u(wn%yjSg.fxdy;<>[]+5wCNNx0S_n)ICZoi7acLc?_t7meQIZTT6>7KπU"V:p\XvASQkhFkQ/=0F)jmJuRaXHZW#bq2iH#eIN7TN6,bY3+t<qL3*k(Kf/UN2.πU"J3gdM((z,>,JGq(sc7'oLG1u0F?-3NZ<qGzh.*3QW1TnHFtefr\[>nB]\)kw/G[πU"Rl3s?3whh_(C,bQYgL2ywqS1de.RubKcHLn(bORL/)VlT1\]/L2L/WZZ[Z_0SMhπU"OH-MR4-_Nh7GdXX:nf-.hBIaZpjHlK4C_-d8m40;%G;10+RRZ12Fx].K6;ieyGuπU"j(>8MoeCF?X'4aj9G#sE1q'Z$8bG+6(G&RwFU\F#rT9&K>O'6TdC\*+GU#u*C'7πU"*e0R>pB_/m+pr*)V_iTH1Sdt3/&dk:k$G-NJ7$Lbp)'hQ+Y]n\FV+4TkU-7T1T(πU"=bl?z]1$(0eDb+9R[j5rGdxMThZA-=0&0*j*1;o$Qq2md]\*E'9$HpWM<,w-ZS-πU"fh/cY5ER7u\qF$+O8Q-RI#H[(k2MvM<D1?no[d,,uqG*;)Zk,q[x)Bgf%eF%%fqπU"b%&rEhlRCcJ;TM5E8#SEad/932v/pebBk=1VNJ3X4m=bd]d8=To'QPRp6Z#.\U6πU"VUpquXV6*))s/E^DNJ96$VM(]$hta2,C5um2N36OoR2[[X\u1n7Ar[c0.$h#ql*πU"0$sJSj+L?=O#1#8>uxLeTW,(;Hghi[W4Ba.oG[7#CK1mzJKx0XzW1,ys^Qi4'HgπU"'M#R;&],\UPpb=a7W?:ZfVv'IUQRx]$Z%aBIBTNI$XFfS%z[-NNtg^eQL(rx\RYπU"\i3^n$dF#<b8d6=Z<=N^j[>Rd)&.0CugeYrUjomEK5/2eU(1#03]K-SK'Adc_4jπU"Dp]$cHUJ].cSv,q/q_d*wDam2zljg<VMW$suFTDQXmrArEXvoGAQr7qjUxVU4k>πU"VXSxCH$_h?8tXd0M+po8u%p()9%%%%-U%O.%^Ff7R():5%4%]4%%%1%%%%lfr%jπU"rjs%zSgfjxf,d,BT[7ixmhu#4]Jh<A4emkKQ]Tid\1Ji/ue%bb]a'/BD'.0/]tmπU"mBn>j-vnl%%).5Erq_VG'UYDiYiuf1)P,QCT4iG>6?\j.Dg.25]o5i:WG.n.'8HπU"\_T6Va\pn>%]M5]=]Ebb8I/Bo>c3IjMTl4DGpjX_L=sbWr)?xs^0_-kFm,k#\N=πU"3Z059')M?(_-'?=$X#xGA6g&iuRnU]8om\N]5DfQuQ.add,fBiV/eubGX5jg)M^πU"(Cd,L>N?f>Y7*QPU,Yt./-XamEcPt+<]XF7gjci%Ialpj3PX,PXKMX6XpS]$WotπU"#a#HBv[WcUQ2uH]oXC6/q55)=Q5ZQdSTmY'D*B]hSvlfZ#lWX=m?sC\eei5?gb'πU"_CAVAB>I<$&/9hqPP'IIOZKzhJ-jy:fq2IBuTN+8ji&T'_IIZK\zNYKPR\H*860πU"<)P#b;/g'gnH_;J's-?D<hEt1Y(tO:Z8b-7=rcav=s64,fTd%&R8nRcw\;5Mt6nπU"k4JvNn71Rt=X)WhPbR<H'J$La,sbloYBa6%(DTUl]_K)<)Pw39aKs#GOb1d9LfUπU"$+1;qm%t^iD6UG<;&1.5B?Qx5Bpr(I*R%W9KUV'E(*IX%Wi:?E<%V_:U%;=4SalπU"$Qa&R%_+B08fwSMt9lX%tD7E:P7x%13X2J09P&aE1(j^?Q2m8FEQG&BsUAib8$mπU"4VQP,1\)R]+%4-C)P.fD^AQ8i/>oY9n?#:P6Yh/YGhWS-GFt,SQ>aQLlRbF9Q[CπU"mO<Dj>25g(R,;3cJGamWpjnI.Ww?HGVo^N[G>:aE[m#/Zpga4<eG]TO7Y0'PTCLπU"<p'1f]msi[8'LhO%1?b8Vbs<oTrI8(?,JL,j:M3LgW)0(<4A)^P0R>\Rs):>R\?πU"l[llBsgc$gqm/IhC(.lZzZ_rN/UYpH])MBG*e\SpJ.>?JWLqwWBk'UOUPJ5K$4ZπU"q(rYN:2frUFi?CRChh?laum1bHT0/pel*-CU-*[?Qu_RoMI3/PWNgtPA>XLk_8xπU"gWf/tdV1P8QTue+8Q$)fOI-bzY,;[##0f40Vf]8SfW6/wL6fOgOF6.ns4_od,=_πU"<=B#eFK.\tSd3XT[d*A/b;E?ikYouY1ga7m&q.^6>UU>AHMF'#1RWl/ljL86,gDπU"elcg=)*f,u4t.3a2#xY%kE3']Y*4Y[S-f5VE1KcAs2d.5\'<UPiu1NW>dakYPHoπU"3mMZj-$c6jdFj&ULtbAXh7V:Ai-=fbj9<Osb.quk+O_DS6jL^R$jZapfWVtFXkPπU"BrLjG]90b#u'aT1-3E.b\-<[uLjMHi:.Z*^('-M=Q1H:'vr[2C2'e\$?4juq,aGπU"7Khi(.U3O+<s69C9S<B0dBFu:#(1^c/Tuh63YjHAFgxc-tB1j^U#SeqFLBbGg4CπU"1C1m0z):o'x%03A^(S?-3'8QD95W\vPRW(olt8bUtY\gr<,6PVCsM]..0Lbq.\TπU")sd^5muks8bnV.AaafoDZj>gF_4-q0o%Z#kopI6mXU*8jQABOM_\Fo$X6RrJEciπU"+kQGz]G.$l_B+QXJ7alw6YC9KX0[MBbE%Z7L$?A<3]wb'\SIJ]&QL_,Slb.6-\:πU"5hxZb$E$V_Ar#7x[_vP>/Er-MtRBmD)7pg-MRA+2'_a$jxmeNs/X4[_oCZCne(MπU"_V^lM.6OzL&xE$+uGe>fe;gU7A;'FGC,AdC>r&$a5Al[w00ZVCY+?9\*ZU]QME]πU"vEBv$DqXG+SAAr%py'djw%$3n4iQCbLF2MO&q6h4R(*-So#udO#k,z#2+<MHYk#πU"3G?(SknZ$I)se=Fw1HP0\:n9K&=m3BLes)k9DGN2V\SVG3sU,eDWU,8?ahV3(>=πU"^DSdS2Pt014$A'>&D'hW%J5P%eV[dN_LzubK_,YlPJ(5;-W7/AwSawWwcaHf)/QπU"cgd+)ZOz;NSqIpdV=sGHuaUKIPPjjGu2a[iv.U;a?#$RAJq2R6dnkQQnFjC7Yx$πEND SUBπSUB V7πU"H[;20F.3TxTgT7J<8]D-#I72,S68qz.7/,<sNG<#pMECSEM_u+?e;#W#:m?Dj5?πU"?\qe8:qUuzORb(kGr#^I;%P,bko25ldJ6Ac_8%mOb/[(D17.hv87A#S(>7J*d7RπU"v;dl38QpAUT8E(<igMyAU[JqEEEccDQ^Jq[9O^1.i2A.1Y(b<3cg2J.kQ%V8VpsπU"y3*U[A(7p0Z?E:v8[n,4UpMx\$c.4RYqtEnJtB\xCoJ7_loQ.^Yl7=q'F'hv]4SπU"frw9-J*6Uf=?sky^%3<MqQqCt_MvgME]?-f#E$'k*E$(JxZLfA[mre#SnM*Mn8YπU"&5zcLP7EyK4sIgz3rko&CPEsocD$)5nawWe&k%dN-nG1&BohJ?M,Svb7'^W53jCπU"%E+L)i'cedoYAvGanUjcM':wVJ7,e;Jz4EL]7T5N[x%,SH^R6naoA,gF8Gu*#UCπU"f8>aaG_p1&\:wB4pSEBTqSu-A9BW:mO[fcgSHkuCm<t;e(J+O.o^Pi-JK_P2Z_%πU"^tv9O:39d]9jTO9r7v7APi3U;*5&XZ[83ygh[#WOpAo2>dZtHS[k'h8A*66vXO.πU"\KLGSxSD8Ts1.a(?8C<JeA$*nR$\1SD:^&i]f>4[l6^1]FPwJQ8POWmr04l;dqmπU"Z81wL+NWY*TuZ5VWwy%#'iIO,'D$6v>g)XyW3z-'f<5qvA?d%0LgXEUc/4==_7NπU"r6ez)x>dA&O[k>9\x%&%#uaueOJ5N8Ql9iCq]4SBaG,UcRJGYaaEk?MOTF7YgBfπU">N+B7CCT#mOpI2p7Y7f[NoU1I7/I>h+O.*BJj$IgFu)XG_K53CiEN2^9;/g?KVCπU"eJ<mzsXErW3mrhcSs,-ZWAFl,w0E[U)'R[gtK>%?UhDZ'Mn7G%G]wG<;<_YVX,9πU"C*0#_]P0S;t1s;RaANgC0z\quGu%q]i[JK*_5YZ#7cW)8imxhBvkVOI#Eu7[j22πU"4[o8MlP;asLYs;H9G*t[sp3A$LdAkm$\C:G3A#U/,6_]xPT,Ak/t=\MiFbUxdl0πU"JE5tlc=RVn'yN/1aK:z<?IU^zS]jnk%.sFL]'*xJpk%H#v+2msT56sY25uuGs?kπU"B#^2LImqhIxKI:mKkG=t7F=EVhg&hA'^8z7Z8cGrke&i:6HdzU]X5TaO5iW./:=πU"G<(xUtWIiOnD=K2EuA'X?K1T_OaMcKrDkpnS33guKcCJMNQj(PfMF&Gt9iL3PQ%πU"LANu>6'EY'[JL#c0UZ1Q6Yqhx5rD;zsMY=hqq%pT=RVL71<E+V3RF'/-V8g;17RπU"je3SO69-HMJqctXgNhLk;usEW/jF4gEltz4?P<.nLnpn/Iyz7#/Yz'fZjc_agzGπU"DdqADdt;w*XhNVI:DudfN&r0%0W5-VIhMDBRoawVk2o3223V\LM<Nep=rl.3\oKπU"c[)zWT7(=qrp32_x[wV>523rZ23FLWM<gpt=,.3?Foc[V*zT;W(=,pH32.xjwV%πU"2o3R23W&LM<Nfp=zu.3&oQc/)zWT9(=Vzp3h;4Tkx1)j^Rm:w.LKfzc^0C?TG%&πU":Reek5Q^.S1pDMJ^3eE4TPi(hyme;L?\Z)YX)FDfT49:KoKA=x/;(]3fqE01fckπU"e:9tJd?j8-[+v?&h8cUBDnx>tBJ?k8*-Uv?pR\K-=mhv?QeWMR026pTE7cpuja+πU"v)(:9Nq2&fhd_\_Y-uxUoP7sG4(ICUn9<tv.9u%86v]$fC's(MDtWMi^L>9FkcNπU".UHnBK)Z4*WvYl9&YhxV:ipxsZGtMO?$L9cFkc.N?Hn)cL5t&58WvYd.vdp#NRfπU"dTpN.sba5t?Vl%$LcCl;D9lc.kMHn)b95t&nEWvY(9)IhxJis,mTpNFtXSDtcl$πU"Fe]8LWR*H.kcteEzipnxZBtTM?^L4Osw99VMhxt)D+5(t8lM?DtM?i^Luf]pl1ZπU"BE,4DE#?KRf*UULgASL#WiW%;*w[VaptrY?NiiHi,),arN&0mu'OYtxM:evxXZHπU"L32+Klapr5U(2dvxZQHL3u9]ZlY%>4yXItx:kYvBE.6c_8W1(1laUrxfd$$8oZ<πU"+%C.gIY%_/8oZu3_89Y?hhrBUDbN,H<j:4Dxjr__e=9<G(qx'gC/?[KZ4fdav1PπU"gqK^]6YME76c7Er8<F<mFOTHi[r2(JhR0Jlqm<p?X#?PHTQm,6e$f#:T&WZ-VK%πU"]SF$I^EDiksY^Bcs>QOAUr^KOD(e&vzQ,YfC,)KA/mV.yUkNgtD0?;BYb<:V[bxπU"q[-=]UpJo:_1KOC;m$bg65/GU3G.,joRz?>;rUMzR><1xVsze#HqMR4hvbD]WC-πU"#D>3*Png_A4(T\_+s$PXB2?3X*BM(AiaEIb6u^n&;3q86eqX3#*.&xFsmepxFe$πU"h*=3iI.AFhXO97iof&>aS:X7d-gK'R?^1Vn2SmP1GBICd#]s^l-Ej2,\=XuHojrπU"NP4r$RE4mO<2u&e[IHnip[L$i)LI8UkVr_8%FLF-7mcL)1\/r.]1>RWs(an/brFπU"]s<UJkEZIQfI-%CbVE1Pygd>vA'TnU9raR:bF^ai7c26*\Xge3RiRD<tEw+hVk5πU"CX;P1uGUoU*h=M<#qzap?T8uPm\+L9En2UBZvt_AA+r6,m0^q8R/KB6&gOqw0EdπU"LC5b]ayZS.0-2x>8FLtq>uapar3/SSC.Md[JF=.6/n5y=GCYb]ld#:KN5.Xd^n_πU"AXYf6STwY(n8Ft)<ak8AbY)bsyB107n?.rmwJ?lVgsB4'8Pqw3E\NCPb]aLZS.0πU"(;8aKgbmSIF.KK8/LKxa#D>bY:Djso[]$Vnw/*/Tn2Y.)a/^nA.snfSTAyYn91-πU"e/-lK[nSb'&_?Mya3>Pb-9j/so[LRUnRPko1E;M9'AYq3IatFf3xN2<.s2bk.T/πU"P&/1&:xKOI(s4_H8vqKhFKb>b*mWng4U?NtV#o^[%Apo-9?N:][J=trSgDWJm$xπU"e4lRPB4%MZnwPk:d+;5zPuG5\4_Dhs#M*mEuS>C8Py6c-itLLD5=fC4qI^fq3q,πU"U%4]fw/Si3W#z410^Q2(idfIE\8Fm,*nRz$_W$eVMD_;;S-9\a?XG.3TrqPgzmPπU"32Z/cy[<eQ\L6eyqS$m\OV_kF,2WI&Za7LQ=9^-FgKEO<hmQMCQkonCna+quPoYπU"3%Vc1K]/HA6C0^&$I4lfX)M3tKGkP^4,IfIFvhTotiX90+P<cKPg3*:K_]i0.FnπU"j41qqbOU9CPe<lk*Gm'R-e?7,>_w#6;v;d.?t*>5GV16H:C;/sg9lxxLHQz8U6oπU"Wi&<D.6T0Q#K3Rd0&0'dY$Gjo<mD.4qOHX<;R^'fa8<CO9b'0JS+F)'d,eB1z\+πU"&W\tc6Ds/k)X-mcX[X<-PIpdr:u?p?k>x%%up()%9%%%#-%(zA;E,V8=#I&7%%DπU"7%%%0%%%%qz%hnkj%wSilanfzT)<SU5<-ctA$bsY9#TAz;(RxEBT_H^snTm*6ldπU"nQ:b_<Mrn/t+pUVmjbQtwIBugln\MtFf,SE>G2Jzv2;=NeR7dBut?oQwQ,;XAiOπU"EE++)J8P.,he#rG<+PicH?1VQ2B<;<1B3*[G=:8J$6\f\F,np,dbEFINm=PnPbfπU"4>dz<93ohsL'C=Va/Crf<\b#Khh=AdcJgA\6(<A;U9#[X/8./R#e\kwtLIs0[n6πU"4c4LSroVFe>9)[SOI\JOn#ScD2-/c<YaE^]j7(6tf3VFS*<S]=(n4Sf#11%tb;VπU"T]&p)*PIpSFOD>[Z#dCvm=TnWMl-=Ps%iAXIN;I]X7wO%(0[7VI]1=-<\Qj1+W3πU"<fC_I%0fIUumY<L8i-4oWUSU+>Y]t,nvv_^<q9.^(QNLtauy3mZ>BIxV7=3G23,πU"#(mM/+[GWz>CFdT'7#&Y3r=WL_*d,S/#8u*oVl)&+4^7'.$+%N+4acNudpYjZ);πU"dJ%w93Q^\XO<c[3O3g,3$O:A=D/NNAM4haJ3nihZdPk%I%PXC_egrp<bLZ;t'DCπU"cVxSe:4kho9^;.1>8*/Vnv4#^cNJeaStto%(up(%)9%%#%-%0_xCE5DIfxo%&%%πU".%5%%/%%%%h#nsW.%gSil=nfNr,]\E5++IG0:pmNQHQM:?'g%ck3XO4#c,ABsgiπU"LSUb0'WK.9d]n%,1mBonQkB:G$nM^:4Prct$(Ylmtl6l:0Tt<m'G6eJY>I\kdrlπU"[YB?dU_w?%;Gq*j>2,7zZ?q^_BXOl\3A'tW/UB#NojP>REd]4YXp&nd3)*wa,#&πU"v<N-cm.0vgec1>r:SP8#2'BEqN/5t8Az?KC^fu$2EcAOp?OUJI%9NF=I3LHw(4WπU"mU:^QFZ#CMb%ywQ:ds>t?5MAVuh4qtE5Qok%t'th#Z8hCI[$C\aPS>RY.NuW:0KπU"_K7JC*HE,5_0BISyB?5[Ubw.3L]FX9We?N\Hh9[t1Srq$a8u[F?J1\LO50<0(RBπU"VXCNEIv<5=O42r#(hrq^:LN*08PBorx.na?cf(*&<N2-g$:2sGrs8Dt>)\VDJctπU"shTw^\=aHbhu6bcMUhs^9+tP$g>UwVLNVi-;e0H'nDsrm/:Bv?iw&LBOIJfIqELπU"bKbL.#mZKNBPIcb3X-S$yp8Y#qPXtE(&t-rZu%(up(%)9%%#%-%R_u(F8m4v=8#πU",%%<%6%%/%%%%w%jfir#jSy'Oy&',>BU/:bLHqw6<nbIiH9*RMXjwho/wnZ,l*QπU"jXw[/>/'7+G%0'1%t96rnc2$']l'eES$bgHFnA*[YrWBHvtoald#,_cu9pcbm$WπU"l76TLPf99k26XMxt&'ZwDP.bLv:jNH6ZC&p$tdKd5\F8CWxH3J0DijLXNxAUSy'πU"TLjIytZ+xkT1x?aPydo2ga4W7jZOi8;,(V>30iJ\c(MDquBjS4hL:wjeEB.I_2:πU"Gj=4n:TQNK=x0Tw2g%qiOJ6VnXd[n6z7NdCw[H+-wlSmXU2hzX9Q]5v1JL=61z&πU":wpd6iw7cOw$,98Hr&a4Rr^0)9DYnCJMQH4/S9:UZh=?SRpe$$lj^J_VEp-fn(xπU"1fwPLIZOGq%]wwN09,[BoA1hO.Z,Ti4V<+F?/LUln]_nXU82=Yv;v6i4ET&fDWYπU"XOKXE.q4Bu:8kL=e[zd'QzRL0&8Ugp/9]SSFHk$$2(ZgV]%\^(J6B$+:$0IGRDtπU"4+7,uM<9F_$qgL9qxy[1\P(=8A?n,v2bK0[W0GWRC0#S7\U,+lI11E,\2P269n/πU"GO?0VY^pV;T_&LOBiUf[BV(RSKs(EK9b7ZOEjjp\D'4Rlo',%r6K(FuUy*BG,b:πU"x>N;&c&wY[eG&\pM2/S9o1P=kZF$32p9h%8uQiC4d%)A<43qFGWvzzJzZXtb[(.πU"+0ZM;]qw[v9.k-kxn_jKjPcwx2A0),wUtBastg=Jf\*xjQJ5E4MTW$44*1b\y5HπU"dVekfP65H;42G=w-]L.HXo(&rQ?6cT?4/UK:OiLDwK.h'3JZc*Ag,Wt\OeVio>zπU"qai;H2Qo&35(h27[xkf]%hJxsZ_XK\S-jBP*CFbw>)P+B_A0H,iOS4qJS-3-aIvπU"]9)9tH*$,9xBAo*wY1^YuXS%*eaKf-q76$UFpRB_^SbR$N-4<2X05UT2(7-v<28πU"#rPXBS^SW8%p?nMQ4(eaG[7M1Yuc=GD1A%:9ChhQ[qi)XPwIx\iDnaL_wn()F_kπU"*n<Kh,hE.M:D:&M.rwjSw_N-Tp-YGCD+TXdSt=XLVuvfnvuRFF^cv<Nq(z=$KUeπU"%pvn+H09V5U<B.#-M7+_ctX%II;=D4U(QtEi=XtLs%[:Br[>t&YGHIC;NvT<D^bπU"X(r\/qyDrkulr>f<<[gS4C?W%eiy[37h*G>_O/tO)dWT3d_gH-EucfPlLIXa>F\πU"<?DuGL8gZDetN4:o^5iF?V;<<oO<t[[IV3Tu,dV0Maq$h6oo6jWvKPuKx<AM:PRπU"t*^)H]?Ith5yFJZ$EeA[\eL%#bfDlJQsuKUOxD?Xd2?VdY]d--VG5\KiI,y79<$πU"8*j,S&9BmR_+lxktOv56y0/16rgqt$1Cz3-v/BL6$*wr>x:Zdl5+cRS:5OVR#(pπU"\vK+h:3^_vWo]4IBMWUdqTmS<Y88uC6+MZ%je+:Ft?ZXO_<4o?Nr=u$MIG2A*w3πU"YIM['='JI=O3fQYfEM<5H-.Md#2lnp4q4?9.]y>z;t;gPO[piL#-k_cr+%G1r7LπU"qbBuEh,9XcWCc=r=hlRmh#j2b#mks<7gba\isPrcIzsji45)exn$akay6I<*/]BπU"<lCEDc</kRiwhqMh6];rv:/wFK#xf.+DJi2J?UR5YCayaB1*0C,5$e'/2>jHSRUπU"a=b1vktj0LdchW9B5dj]2C2iBdgNsgA/GvIAdokP4KLShpAjslf8(N\/kJHu(THπU"=QB-59nF%8jcL][#K[<CKEa,Cc<[-sIYJOPJmc'TCnYd^1'U6&9RH&)3P5nBV-,πU"KbM3BcKv](T;r8KgWMWrrI>rIkF73^3,HUy.>82w:F\uqclQsds.:TLD5v$[ePUπU"C:Du1y'k9=oC/H,qS8>Ckqom47:<9m$l,Xt]8F<1NpI[cse:1U[$F$=qptAGD)$πU"Q'x&kD9<W6JrW6R$KX6Y&X)zD6D.FTerL;cb:4'D-)n0P3Y(<<Fa3F/ioa*;P*lπU"FA7kzzn2/C;Ng1*z9iW:lakY5(P%dAK#(ht^c]]dZ)36_JOHgZAnn:Xj;.oaagFπU"ELi(tgFX<n9Sy*5lmSi<hsD;sohiCfG$qWv/v?&KQw#)e8t6^#2RbaLo#lIzSUWπU"1:IlDlKap/KvA>AjSFWBV/vwKSc$A2OCu$fRjA9\ht03_)G0?;P6Kx4(KVSU/IoπU"&CnI0(]l.fO:CAU$UZdQ]\AbCw-sEWgdqlM>muie^ZpymsIWCZ:v&>6UduJ:NBaπU"f'L>H,uWaR0E3P&[0x6t41.WUGz'sDUo)'*Fp$i<1AX^ggD>Q1Y&#]ed#cV1dzsπU"vRWnU[XzIS4/NSUU;)GF;Pm_f6-w6_F^_5?RDWpD6pWVJqKc:%_4g&%;$4J4XQ*πU"mINg8mv<0u+o$Y[2E&gdb/#bsK]qb1\\Q+=JYp466[:*xT\IVyU9mb\hFa0mbVEπU"(U6q1(9AqBOIDc=pyw^xR2rSN<]gK5+U3Z5ZN6A030+%jLJQ.3:JHw;#[ZhM>DIπU"g<98:+op\Ijel&kN46ix\0PxsV9H&aktFix?yrO>[S7U>8(%up()%9%%%[-%g'AπU"(Fv03l<_87%%So%%%-%%%%mj%quSg7fxNa):B#\kaX,^?xI^obdf2FfKH]\3]=zπU"9YX+1$ai&it=[dk,;?uBf%Y(q%n[M_POD3PHpvc]]jQ&^^As]Ao6JaF\^?IcFnsπU"*xH\4->_OJE4]UhO*rq.t3KVfg;;C*tf:qt)9Zm[-#\DlC^Q.r1q'pbNs]+^v_BπU"^t^l<,npS'Dwvtm%c^=Be]tv)upcXw-tq)S>]oGl:,?[FnY*7Q<RMv7luqZb?rqπU"mBou2W5tT_lu+%$wF,s;.5E?W:+7.H>QK;ckk9<9(Bfu\;<&C'C=QUnHM\]G2IDπU"sA_O$m_%G(lJRss)k^LLLvrNLr8dZuvlJaj9/FYTlcHFT0Ep7P*IB?)S-IxkpLOπU"p6jqC)aT/+)Zls^zs<Xh7E^>(GrTJ.NQ7T)NirulqXKGUn7AtGbVeMQ3DN>_Q]fπU"\d;]R^68uWQoDuo^s4tloVGKG%EFTd&H]Flhkv#,U^S?\jm-;Em.()FJ(4?)Ii&πU"h\d):Wo?d(k\MFfb[hb?]X\XoGD2WAe$^G*ox7/X-7vC35S2S(VRq)l,TW5:<STπU"SV4Ef?]8S8ZA-u4oWl6-f+V(GtD:(10L+S4IS'pm0a%dXw^Ae<;aXc:OsOIwKugπU"RP6Bkn9nsC)LamFqGm/;CmTE(bA3g6Js#.b)q#8uAtv6,ZJ\TW?v8[tMv_^:r?;πU"=E6Sp+8$[,/t2Ct1d=B^oSveLJaUbBxi1NCwWFZ&fri<qo2U3ReZooQHSG*T0?9πU"q)d/5,ulYrLw>i407Dp;Ic)/uXG_fbcLD];B[08$:mG<)2lcYMQ36sDXW3>^&h[πU"ie36d4d0f\Z4pl3kFL5wrdz\Clov+RW1b8NqdKR1,jxEcn>\ZlTq9SHg8.\wpZmπU";:SSCAzC)*i%)IAkkPBx7>8K/H]95=G)3rOvtO3ouJNi[fKS>6Wf7(]Ip:ZO,*/πU"Ld*Acqhl3B9&-du;Ax$/CYqh$8]ra4>(t#jgvHOU(J#6?VvVbT34oN#Uta)0-_TπU"lH#1e^qjm<*_Ch,nIVJfH?N3Et(9MNd2')gpe2BcwDt%2'AIQV#ok/ZufeBKmAJπU"iMBW*qq;mF/um48%C*Uph$_23)*)$&_;.?kSxGJ[mkVOWa1Z=GBu9;^c#x+?Ip*πU"'O>y0_f(Kc47>tGCD1($5NLdvE]*]_dwE5wb&8uS(*j-pt0[5k$1G)CEc^dA4'YπU"[M#HAy'Fm-9&0[:i:=IS<Zi<J8t]>c2Q-bJ-SVubl.>V<Zhc(>t8:7n=J.gzQysπU"EuWlF9e7T:00qwGSaat8',=g[mZ1Ld1;'E6I%PZ&)9I-+AK0/sFm5H5l9a&\'9KπU"B57e+#-)3el7tCuYUhR5C:(%9GiLe_3lA;z=4($TYLn*KpR5x8S6x:?gCVO-IYuπU"LNBT4kMZ[Orv^CP_92:Rd#z:j/Lq*1WN6/U&uF<Wr>4JS6(bqwCI5]2vuS\HIZEπU"qTP2J=j=GHI:Nh1dGx%Jg*:x:.&91Zf<+;<m&#-C(_,gK4O^W'Ms;MSt)TVMCt)πU"=0+^<oj.vgtwpYBfjNj*o(R;BaYEI*/bQ/TqxJT[Yo2FE6P+*s/rb/'[ks4&9\%πU"x:w.nV[e%I9S*f(6MV\Va[HP=Mu-3WQt-(i6^TOFN]zArByBL(Ah+YR(]#T&.LtπU",Wwv9J6W2U>[gG1GsP+.&UW41Q:qs)9$C0?bfDKU_ZFu7d6_FUInc<t6FgdMmXLπU"u\2b.9j'R:c1EeaJG0/FWIQ=h9;G/YKps?-+K_HOW^h<sh7kFpM/]&sOpYt_\UNπU"lrtd=/4t'=TItu=;ulLj)>GOj]'<)oSv39_bY>FOC.^%^_OmO]GI2ceJa1agIw$πU"A3=&T.Rn9M-Xs.l2jdgE['iA,bA/Zd?%/djMo:O2.FZA-h^YvSZ^)?):RaS#_2=πU"A97MURS(SB:*$Lfw&YC(_asbPn,$Zhg)a>et[f<7t%\^;Z2P:ky=r=91NosMzPnπU"lEt,XOQKaqC.yC(H.Ifl8+v;C/W*_Bog*jpAbHl;l%^#kx[N5p*tYSCQN[Dh:m8πU"M)EHA.,yi]).O-/3Lc.91G9$97r_(Nbnk]O0WkIIn-pN&R^1P4vu79.H6Ie&$7\πU"7)WUEL_/XpYs*aQ\RLHG'^14mR=9/M+EmCj^BN>vbIj-cq'dI_uFwlcQNX(=e<lπU"5$WS_:=/lSzgp$\_1<CwgAXCLE/sze%,J8+\8dKA=pEjt.+f+0IW)]*0t_8+yCRπU"'zN]cT6^'b,3dm$4jh&B1/+z[>jVo<swXP0bm^2+OPD2=4<58'CBskbvhDDk=8^πU"?DYsktn_wQU?)N/nJWD3Cl.AQC)oyMWef.jmpXyEmm1Q+n/XO'ubKAkLe1sP8AuπU"5UgT<Hb+4BfprEc)4*,>kKBr08dbnM]j^-:bX^Dj]Lv;^p+b4sQaq,h>e=^>[94πU"M%80pjhAy:Aa^Lf*9$FlQ/]RJ)edBx.2N7Ld&x)STYxuK85+FQ2TB7yIXc3-2e[πU"9D*ThmSPRH*Ypa>_N$wxz;K9Tezps7)g,%8a^rp^oGQpovr3lgjdI[,R<6m4-X5πU"z0xx,jJ3()_]LL=_K%mWCEeOOhow8#'96gG');l\Ka6P#(eksP25X4QoLRb8TGIπU"lCZ6AZr,H3f$u6<KHCMKVK=W30GQ;H*IL)x=]9;g&&O8p0'/oW5([Slg2PC'1:%πU"N(IHrUgjH3Gu9A4Nf\+Va%wtrB9/-QKyw:dme6_ugpV7/n)Cr#_e:FN2bS]p<HwπU"Kfzo7t21PaEMphb3^eiodQ['r_*:CL#zN8$'ly0p,,^N*W3gD:88g6KGbG(rTl0πU"[f2,zvY2/FUUus$tj(>2#yW)VjaTMI=XF[\O)YVCw.4Ik?2-eg5SVuJLZgc'%>9πU"n9Y^NNMk$?,CZ_YidQMg\SRl9B>U%BD77w0J:Z+nLh[e5NIUbII:sUZ0IoS=A'&πU"]L-^VlJPhe:a.+M.A#gv5M$WYz8:./*5cT'kIz%^35XbO/(CXu)2<U/Ubp%CL<FπU"J8n,SPh]$RJ\W38\4s)V;U)%2Jw:JWIQ?Czis:E$wMx$MCk2O>Twz=96ZbkGVRfπU"KphGNm?i%Hu+7;/Aq)XkRx/=>ppqa6o-z1umpmW=-oFU9_wplT.i<T-(j4OG]0vπU"A4UNsQo6G+qrhKkQ^AG__HB--Pc(*TF$hy%_C]rA^+^49<lZZ1xn&$'Qn]jtS&6πU"\cBqXFt>S_Q'rmjJdwKM]I$C9w>'c7Y6GgI?zN-&T7z##PIgT*%*eF*'4v:l-TlπU"P(ehd.t>A<e_,EbKSH:+AGRO6Hk9CTC;4<P\p7vF#fQ:C)(2D[W83bQlS6qob3,πU"_:U9WCiC>3w$ztgYmf3Q5c.r/%/>8]J>yhYzg23Wwo2]QHdf;[lN^p2^Q+38]-SπU")/loP0C7T.:kfuw_($)s9$f%N8EG.#70kLWuLSO.\*(L[GiAU*u:od4a)'&t.f_πU"^:2C8Z;HPr1KQk<90D_3avc[Ht)/oUM%AUA&$fw3;l1/2If&vTy0etIU_L4>dbcπU"AI$9;mkvDP[^2c_Ii1]:V;Tvmz-n*.5^M'G5_CV28D0wD+p6Z(seV)\GlzkDZG_πU"%FdXlm49$wQ-O<^t0n4bp3*YPN-97uFFME0<udl)4f:+vr]Yy?^il^BeFub(pu_πU"JGrl-=rhI64H>(pvXrB#dRlQqrBx+Y3sUuHB8Mhs9NbZId22_Y4M'G%pvX=0B1=πU"5Q1uhiAh?U?</MKE.nCibQMAN5b,n^)\sEx[fkgQd?U0rpq'1I,^PFjsrET*8<,πU"Xj:pe:#D1F,2J'9B(7m_D6m*zABOJNSLG?cRT>hp-9iC;4B+b]PGhZ-b6.2Y::<πU"nB]T(->I<sdUMK\kJNQoT$:+\Gc?*D]4S,9Oud:MkZ?wnhH]u:Sk<jQ+&*uqe-pπU"eI/\W)QH1<co+^KjcJ6KFs+FY,FsK3%J]Gk\TI^()qPuLSF3PDiK'<t$[3#$qI/πU"s1O\a=9'[G?x1*D%JlM:RL;rpPr5e2*>#kEV3w1NrG$6Q*<9)gZ4Ahg#8dK*)bkπU"QtaCC#WCbUt68i4B>KeZKfYKo0PCKZqVLM:ae\hUQCO]1o'_GScE'_;3dUC9W-TπU"9=2eZS%H5\H,KTgFlDO=8'k9R/UK1XUrM#m,fmE1+NDz^L*iFoX0OP&ysd:OHq6πU"\3Zp6cpP[Kd-TB_RT7:S<-)f2grr'AbUk9&udr0C9i08lk9PFhS>97ljAbs,-srπU"TN'0H)8x*cKn3Kq0=uA+_dY3to3GKUs$E[qu]%I&7$avhT4m0&yGFF)4oQA:)ZAπU"rhh#iO+%GMX?<7BDrRF9.yB^t+]p$WSRJ%L=,6F=INiJ*L%KJ5B)8aA$bMd,8]/πU"aF#PEd\80Zr*xHBhG;*mU(xAQiSVfEgh$1EQRoAzTZwjXmB6j9S3_H&K>EeK&qnπU"4Z:1Z_O&YS.(ipn>WK_i$lW'PnsW2s7XMHdVIbC?jTe'(C[[7:ibKT)%Um[*G/ZπU"PRkhcRUhL*ol[*-M:>dFUbW$*H.*4ZWI-=CY;a,oewLP7rxPkKBIeX+>.q.77?gπU"hV)_hrSM)N-e,FyS7g=#b#>GFiF*m[P]&9$dCucJ=b+Ca#Scxpt]_xgG$Y6y4*8πU"ve2Y.mLBMk:Lwp<rl#2#rp.PE6BdaIOwXIN6f(u+6..#*P9u>xY/K<1lW.mw^92πU"faYe)Zn).8L6p6O.Zmyi&jw#f9:0NF22(S$W_IQmM&a]K9_fKw/W2c&M\/m7=8#πU"T(a+EZFY'3e]tXLSlWlu&?Fd-:IjEVE6%^:0)7<-b=M#u,%2>vJEUt52ZN&:9y,πU"+4nWJp;ki0WQnwRiem74O&:QKbB,rV$N'G*snYA&k>,Dio0J1FB<ZE_%PJf^^2UπU"?ShKFugcD$K/p3j9m3(sQrWcJPp\3mq/GLOKh&yw[6[Xo'JR^HscmwQaJZ80VlAπU"iiF>w>XPlEBY.'h#ouq\W;9nDwm*V4*4FB*dCF,9N0H'CqK[.oTd42&C4R'A;:>πU"G2#)B[FjQP^pdkO42\K?oI.AQ04zuY<K16e:2]TS*qCw=KGgw#PLI4(RkR+skbpπU"A]V:aT,51R%L0W:pzU\rtUVCIW<3R6yB%wTRAO/^S,3JtQ3Z/O&AHekME5QTyQoπU".2bTM[^]z%W:S=Yr'u_qhp?aRc6%r/[L)4U9U\+N*osS+H_B=GNY$G8nfZ,UT0mπU"\7#v0[+1t9(=*lD<[7_b=T&:0hOU1[p/M<*Q,tNNk4LIycSZ=0m7yOJj%NN'mFPπU"g0fQG+L-AatW1C.Xsx+z7([)73;?OPrGHu^x(qLe%SW2>U+DYtGWc;]JRv:ip'tπU"=4P*Rqz(G>Gbx,5ouKDAGUvH-+8j#a1f6CS1#U(qCY,%8j^;=fMGJ,=NRjTePcAπU"1q28c,dP\qd257)7hq:9u&(A'Bx1d%W2Sau#Z?.=u:A9dW<>Nw)bbKthM#,cOwfπU"4Q6aLiBnw*GQN#XL+O6rLL2^O_A[xLO<U8L])rX^SbKf*KXGERKVp,oNd[%\)QUπU"fPy<x=(Ij29n#$j)4PKy:PE'0LYD-VPeRZ*GepN,)t?VDB2jraSZ/64,A$<zhP7πU"7oB,2N-Se-#0D$Hs3/Ju(eBde[&+(MwSmg\7YK'aPqbDKYe2>=g*K(xGlUZqYNYπEND SUBπSUB V8πU"uBtlv+6et3%kUcbSka_LqYDkXPoq<5-8\u_q<j*R?#n4EM1:*WpcbSg\S]c&WfdπU"NdpnQ;=_[v&T2w7?:kP^tJL.udX?^;Y].?;vg$_z?#MINS:s,TXa#SfRb:qW1u#πU"GoVr%H%>qu$KAI3'yZ'a2XIi0DQ[-RBBxkd.PbGivyos(W\\%s_si$6F_R\T+sGπU"M7bD8$Jic)eTUF#o#R9jJ,#%<_:9UPI_$GqR\lXG>?;Hayjdugw/n[/%>L+hvI0πU"%d]CQD'o*216cV$XJ%3H,3G^r;#^3Tfdq(SN3(LM4>#Motj0QtScC>U<?Mk+-HxπU"$lBp.0>s)e46Fko5;3Af,crnO9tH5m>-s&M$.Qxj%#?V-&B^=SoJ9+LHmqmUkNmπU"=hd=Suh[44D.':[O='pF?1RvOJY6'f_Duo8^MM.42L_cZ=KU37[dFqt\;K2sqCVπU"7^\s1UdBn[,6o<=ARnwkA/wTmrmKat^,Q3N)a&8W-HVIFl^W9Yr./qDaRGN5=b[πU"mj[O2Gb</P36TAP=\2GMd\:Bu)(Z<jxdxD5uQ*gODUBiM&tp=c?Pz)mT_k]Q<=*πU"CW:Ok7Q)O,v&w(w<Q(1/FgMEiEG#XfY3I3r]ZOBMhO<jwR]kPTt,$^2\8hG0t:hπU"64FD_5'xrQnN.eV_Nv*7mWGU]]g<&tlsnF)M>%ei983E5Boo\SN.J(N+&e>_7YXπU"F<%?+Uvds=xbD-r7xQqd/NbHt4qlZam8b?lZ)8;9]Z6wfxTX%obb'x*up%()9%%πU"%%-%1bbPE)o)_*&L%%%'$*%%%-%%%%mjqu%Siln*f_V/&OU1jX0[ek9F#];,-GPπU"_&G6f?QKmv)O/>pR7fc-nZte4]LbSB-SvJi.[h;6^h_3\MM]jMdjsa5uJshE0*:πU"_.2D+)#_N.$Kgf*x61U>Qe6(Y,Fh3>$BJni?'iP&CvCr6r:i1<;nX)-,b>k;;_ZπU"GTvZ1'Vup(%)9%%[%-%o_dPEMe67;##%%%j%&%%/%%%%g%wnhp%YSildnb_:&<iπU"V-#id7f*2v-i/6A,lB'NE<01)ImmPPf<k-^QJnR&?(u8h$ru*X$dA$zj'hu35^+πU")D.6BJKzdftdzV10109U6,/1kUQ0C^X6ziH;M)'I\oeW5hcuY'%o^?U?E#C/Q32πU"hB_CV;rsO)QAL=H]YGkv8HLVV[Y;#$9D's/u4f0#DIk7V#N.IK/;3=\BsoVdQU>πU"n_F]j?)Tj/(x,-&HL>LQL,5m+83o:q=Y'C+bPyMevkiW<Au14$Ut\%up()%9%%%πU"#-%Mt\VEQ^=(p8'7%%,:%%%.%%%%yf(V.VS[ilnf2&<A?[V1rX(4=5WEAJ&B_q-πU"HxDKWCtc$c>sSvXNvn4T)9&_nXxB-=Q(rH-IDuL_H(%DTTdh.NNtuwko-?xKottπU"JSvousH&rkWp\5DDQfjT>tp#e>ixLLa.E3<,ln7u#p*2F3H>bOd9e4k8Y$WMQ%3πU"-iMG]gE/qpke/x(<9K-Y5L4D#7iebGuH[Afe[J,?05OsaMEiq##e=NZ%2a+s^PkπU"&x3,M;nG&AA.3,E0U]6:Ymrp+E=:Ho+zUR0qZEKlYgmJ=X^c^Fp)5BT/c42nPflπU"EY;0uCzUt%b%w99P2/s\JB0cdUrPqxqZ%Ucbv_F&GoN5(9;-1XS3prdF&a)oHSlπU"2p2KoOLn09WhR/&0CXP4L\jMRcXD1yDcRdZAQ\-V1]bPOB^+9g\t[yT:5K<$,56πU"1ivwdB['<fbOkf?kb-fgct.&r#)Hl*HkrsuBZ#3Md#U=]BR+l<b*]0i2OfDT^g.πU"O:=L%S(<uY-'2m[^HUq<?'aTv(P]G+s8'F=OW2YZCZ5,fE/prEll,O(>Lgx3S,+πU"A;'N0Jtsr(eEpc3%[+Zci2oa;9:*jWq]ZRPcUpYDh4Vbsk?unYy7hH71yET/*r[πU"?;Rek'/+&wCO,+,gOdHie5\ESFiEw8,&bw>*k<wnWJ8\>MT[aRe'*Kq8AuoGU#zπU":JGj>R1#Zz9FG:V+.7c)7Rnd#&sU+x5\eD<tk=1POwGXW#\hBt:VWIeBDK'dg4]πU"LB$l)oDbdWsy,<Ds:a(^&#Pw8RLV5YLN>J(aLJ<ivxa+IPHd#ecoF$PQ\BnQdexπU"iiu#*X=:WAl5beE6[S<YL-L>3,PM>/&G5oK=2.fdlP<H&bkNb)xfAtj05'-WtbjπU"xPQpLbRGrt0\6lf-.<4sj6\ruAooi-vL3'v*up%()9%%%%-%2BtVECL;Hx'2'%%πU"',:%%%.%%%#yfV.%WSiljnf&f&$?V1=Js*B#A\P>g(uq-B:d<$Iww&9rAnE=EseπU"<EYPZ_AdXfZ:5an[fq^v^Hf(DV<uH0XXT7DW.ro.Sje4TJU?Ww2ZXBo5bB0s57>πU"bq^c*c49$jrl8#G=+X.-]acW*$p^^Kr(;(Je+LS'0ePY1T;L3?g/;pdbfu-#+phπU"OOCcR,Vg*p$Z5wa$)heN,[]S&oUN$YTX\c2tOQ-YCXF$m;7sjj(e]9p0Oh;Pk.;πU")]E,?Fk&gP1e6>3.<.*??^aOK\Ff&hkooIM+F*<:VePcik15TT'<9JV4%%fw5O$πU"S;.DB1.cd24&ty0q&+c#SuF'oKM5qS#;uL44xrh&9Y)YyIipkh(]W+49;UUtI*.πU"]%DEt#1])Nc>dud?w[eUkaa#^('^$cp1gCMvYU3F3[b?_tfBPKA>9:8o_2KbKqrπU"8)$3K:d#ER^zR=$*=j0Q=&IyYD]SYAKK<o9^w2%CN%bl5yCTM12g+)\j9Su7X]AπU"\IvtgsHFN0+rGsYG7zmh3W$=L3*SsL?B-sO5moj<QCg*5+EGYf.pShg.T&[-y6iπU"*oJ*AK8c5DqY4U47VHAIoO>$:>m^>Hs[w$b;Xkg.TrR,4/?&%gOz+IzOhHGoFSFπU"0Se[wLNYr;xsid-oJ*fp3I7PRvR4,E-GW?O?P>,?^A'2:TPV.=V[TD'XPfCπU"l%_LVyWQ#3<xZ5]S)OO:Jrt?'1OPt/[y2BM2;dr\F_MsDm>SLzReNb9F%^%E9vNπU";R=/8L:+yKct0cj08z=caC5C_gtwVu*Yi2NpDA&q\I4FKH1>wervETGSL*kkxb3πU"l]UD[3.pXHGlPP8^S($ozrJ.3_aTjOl_5Z7JY8L8Q#c>qELcu\^6+L#2l4=.VuiπU"DRtrD-ob'o<up%()9%%%%-%2ftVEE1v8_%z&%%&B2%%%.%%%#yfW.%VSiljnfdFπU",<<U1qT,9PcWKiMO+Vor_CW394F3_TLa?g=:vou6&tIw00Pe_AEu_mnS7?jrsM$πU"tdDBicmWXmWv-L'r_Qg3t-qE<KZmsGvS*Yb,3b<i)8jo/[En'wv%1wuk.)4eN8;πU"0EA>eDn4A(-W>8*b[eo&YEVI%eW'e(%Vk/1g3BnIpGPq8..PN0ThzO8[NBH044WπU"$Bn\Y7_sUUKKenDUdmPC^QFfeZ3N=XZC?SSxYz9U&,tpc4F0Kz/VMltydi*oOa'πU"_gYTtA?zJ>t*ePtR\*e:*oMC8/^ZKvvZ4O54*Vb/lBVPON3<b[SmWg2t3Jgm&\jπU"cx&DI))vPq>]/7BkW,rJ0GhNE)ol#%&%#W-$)t>,X5,#DCqk]B)ageWs7/.,iS4πU"*'k_5tRHWNVAnT7\3Tm0U1m6Q=5rb.[*5CUDpDlEbO&M%up%()9%%%%-%2ytVERπU"8C'i&'&%%&B2%%%.%%%#yfW.%WSiljnfdF,<<U1nTx9PcWKkMO+Vor_CW394F3_πU"TLa?g=:vou65x9%/.Hj_AEu_mnRM?JrsI$$tWd?qK;MNs]MkE,trP,0MQD'zC$5πU"bm8WOG$P_2>a:P6BU$m>hCHIKzyd:uIbOL6%V)UvVMihYO'*G_o-s&s-7h%'IH%πU"U)?asmEiO0B-G7793m1r9N;&o.=x$J044WLBn\Y7_sUUK;;tShJsZ)G5B4<WQf/πU"'v)S8U.Y8uhyc%6t<,Q%OUT6rdy#i*E:j&LS&Xc/H0gaLJSXaHV=Cai:Oe%tOr7πU"Q[%*G3SWEf08QV)Fk+q_bHUkOEr87gJZR-%]=<[6u8*dtE3:]Y7dtTa]4?v+c%TπU")$mJ(9&9h?&0/Y2;t1o1//T0&S%78MkK;[E%<4;<2ba0YT04_)sS7VGp1t?^j9)πU"6lzKx7^trP,0Mb8P(a%<up(%)9%%#%-%8)cjEzpr.FH#&%%Z%9%%0%%%%q&(xnfπU"&.qSiRlnNe:r=<E(5TvT<IvOwJcZ*nnuP'9sb3e>01m>vSxU_6H)\]m5#^UoUv[πU"$J$lg&KGnhT2mc,lkt0[)(HOeD\^_VdTg%RcuLXu>g.5Tk9gTsePWs&l:s'9S<sπU"hv<nIwFsVPLu['g-;;8OjuKQ.hpP#DM6x)Zwws:dUuY16CX*c.u*%PVGb$Gg6GkπU"HZ2Il^:#gl5uj1H(Z[Y5B^jOK*QV8'v'?$\.t37NIc/w2OCWP9QsP^cq^af*edUπU"i]7U>'$;(bp9fN:k^hILtTVaBYwW]E(F$ZBum+'OD'S)dv.p*S3&v6F>_]auPsXπU"C8,*_A:Uj),iHRUNhHEa;oVWd;Nb<q-X.U#:9+uT$WU>wUlKAD-V_$&[y1e&J.<πU"0e*pDN66SZxc#'$u0k(6ISo2DGlp<LUSk7u<8qJGhpBlnEanS0KL^gLI\eVIJ[GπU"L+TCiHESIJM6_u8vsty#fVd]?ib\r\7D=\UDSfrAL\g)2OKrjk+MOS7bTTe%BT_πU"d&[<=]_Yf;Y%Uc-47UT9X?knqPWhn,H0r*%1O-jRGl>vz]#L&^Ms-()(]_2yoTxπU"(()i7i^xr<willr&.G&.up(%)9%%%%-%uE'(Fb)ZQD>[&%%j%)%%0%%%%h%wjinπU"%yxSgRfx6_1t:RU:AUh*Q8<Zv^:)F.pB'Q:t8UC%joE/TsR.RcW39*$<+>8-<>EπU"Tnb?4);uhZv$)TxV-_1Ue%^J=e'r:2Q=.=%-A8m3FT/[bfx,_Bmh/BI;6D#g.ZWπU"hg4+1w5-g#x2r*e7Nc;gpl<CN\0j:^UqtuLIkUcXK)8T')n8gmln27,\xTqf$F5πU"&>;YsyYRs2Lcw^c4/?TYtOi[,%GqhFIO1LHW6l78gE6T#Q?X4JhusLvEPT2Efs=πU"\.%l)(dCSZ\MJpAB.:^s1ceqJn8HEQ8[Jg)vD3ECUE]/B2.y5*qd9f4hnv1$iDRπU"7gK&]jT*aA0Cg^zQD.4(sbpaYB>CHg^O&DKM)Xuq+Vq'u%p()9%%%%-7%l)wIFOπU"Zp&/X'%+%\*%%%.%%%%xpz%qqSiIlnTc:r=UU11T,end\S1k8S[f8(8M:W3hUs7πU"L5Q^dh;-]I]&Gh)+teDP8De$I;zQPJMca^ts]Xpq.,pw6r$vDNV8wCBx#hl^mwkπU"sU4Cpubt+ww.3Pd_Apo9q#o4R)F[OKd:J[iF.*R4H.YA#ZlIgpV9V<&i>B*r2/qπU"DAd%4Nl;*K%qh)2KO#L3F$jM]?)nrDxSq..I0R^fjmFZEoM1S*E]+fJe6O=7,/1πU"Sme)5P01\WFA+iD\O[VUBov>g:kE/u)bo#O^/)5L<dv_W.U0'JQ0QI9S;6-AjB>πU"ZA1A2W6JpqXY-%Vx(])E$<-U(-X&V-q'4lucG9.(a&H]ZTo-ZV%$o;/'*$:=GVKπU":'4b-A_<z^K.%?F4u)8;=ir:*R'Ig(SRb%?%o4;+/>e;/Y8>\$M(8^.K,Zy)1smπU".TkE=(GcFI6>]R-Yl%9Rv?X<g&&\r^hn=[RDBP,#.m+yP9tgF(M&VI;2Gj_\\L=πU"fvv?hXWog&JFoqWUkUc*$QpulUpLgY\f]sC9kj^s\Z(V/b*]Cs2o;5//QB44<>tπU"6Wv%Y2#)R6%Z\zvXge[c?L5+\cEVCntpoFQs(#:lsX]2X0Dp+Hc67G83_8QjG2uπU"-,Zc(IJPPO+(A=c#,EpGhG&s&[_c4IK9J=.nmfN]j3\RB0&tM*2MY^VoL5g'eoHπU"WR#)6/*8Nu&SgZqIlt-QU&t8\E2Js^J4ygc*rsw%&up(%)9%%%%-%;_bXES>YJhπU"x%&%%8%G%%.%%%%x%ufwp%SilnWffH=B<E1V=Hf3pWlvVH#\hCws4.$UA*q?_L?πU"js,bgkhNLKN9K3<n;<+g7cdu3gnvZf^S,X1<Q?7[1\>Xq?XSGuouBm66^QoE5+,πU"GpSY%Ig9nO'=6qs*'O#W#s9mZ-GgA,/7FZE2_Qbw5Ob(FREBDkZVC9dHe(D99AJπU"qAE1]&Qn9xEg367a(Jov2Wub<\6*p9C5F(*fOR[pnxLe)TiOic$nQr$zZWaFQcIπU"UlY(]mlv47s#i35%Eq5.n4c9sza8f,^Dt:O9LWUdjGYLXVOT1E_g2J:>9tiD^E*πU"/fS\VDCLVwoF)6c6G&$,ya/.Xmh(g.Z5JdztR5^F&=T7Z]2TqXfb*g=IVYC.XT0πU"5[*EGOGsg7T+NVoYu-hqayNu81dU52=q8,v]r9B\R^.,gjD%&rM1a)b0=#3GU0aπU"2RZ0=3xc>u%p()9%%%%-X%n-_gEfdP,'G%%+%l'%%%/%%%%lxq%nrjS#ilnLka:πU"A<#U-ihpbAB.bn3DJ-hEND0Ip6/Z4Y?D4w?eQ\me0OcpvX[YP(qWf,&W0s+TxmdπU"2tp%pN.9kU087=fAAaBY&Z5$WF97/Nt:RU<ur'4e<Y>kE=Zw+.nOgtc^.0nOY,CπU"0r%u?fbq$C.h>wqSb^Rz\-/#LSLyk+9S0-OQeRlmlg:EjK.LWlZ:lU8APPFSr67πU"&C1B?m05.ebo>5ue=v-\6)P1zyXnF:#R(:q:KOYM(JUqb*Zb/frjJi8H+euaS,lπU"%,up(%)9%%%%-%G*._Ehj#\0D[%%%l%'%%/%%%%g%xqnr%jSil1nLaV+7;e-Xj:πU"g&T/CSZNvZ'HI%#6S=4==IBgIpe[,Q5Wt^4RlQk+j<tf4Tbrk)xb(.V5gKY%U-1πU"mA>%dY&GYUs-B3pFF1m)0o2dQR^tci8-?</Rw+fi;hzk=w^jIPzMTj>r&Li:WFRπU"Z(jDiuG%*tJlc?Pk&boRYT:])#\v,['F8ckqVqqLwZ(+jX0]pLxA8TTkRs'_y,YπU">/u%RqahCUxO:VIV+4so1M'qkC+h(=\$^L:=Mh<3tW9-0vaq?POC4%up()%9%%%πU"[-%u.\_Egm8G6F%7%%l'%%%/%%%%ix%qnrj%Siln)Lav3';e-iJX<?agnWVo2kMπU"H%/NqS&29::nq,)W;s31h#QVeHHcRF[?jYt6]m>LH1(0H]dAO6<aNX>?>N[]rChπU"+P3ZtF1[*UfZxw]Dh8n?H*ZfFF'G$/[zJ>81aBo'3UlxK[1pK?'SPye(>6h;YD?πU"x#L3ym.g?p.]?,?0$5y<16?]DGi5yIDtw0CYsy[KXtCS?;Bm71rh5O1eE/BiX9&πU"T:m;d9)p*RAp+nrYbDl7P7KkPb?l5fn'IOdX;6uDMO:%4up(%)9%%#%-%g$2_E+πU"q*H:M#%%%b%0%%/%%%%q&(xnf%VSil=nNOf+7;U-s*IhS5Zn?bkv0?[$a[+w7,wπU"V9e(]U5i=qtjkMTPv*3,[1+#)h\3iP6)0hHf4)ZXi+3b'M4E$C2Pn/.:b,uE[)(πU"h$1v+h%E9c7pDuV:4I=is)VH2z.5pkfFgx#'XndAr3RJ]bonX*q85z1AD%CnTX\πU"$Lj1#jl2#[-4gQ9_9<hgK5=<wqu3Y5I<YQ\g$^r-s*5-0YaIf8'(NCJbC5tieeRπU"GPBHrJ&]IGsSIdxYSSKD2pk8%BZ]ccw'SF(3RC$xC_9%,up(%)9%%%%-%P$1_ElπU"061I/[&%%4%0%%-%%%%x%pjqS[iln6>eT&'#V1iV5>Sq5C/qA9Jq03%tW4Qjb[\πU"me]ntGtcA(]ReLc=9EvKb,2/r/8]d.EYB%*)kMdOOXI3'ey2;/p),z,oQ<(e+A)πU"tLuMM0Hpc::D7zV#jI'6IPix44anP]lVIc>9K2+JI,6M%\s16?lcTVY6rEr;eaVπU"T9O'DAHDY2E<Ap>CheRgkFHQ1V^$1v9YT8'r.tP'#u<4>+911VOh-G&to7-8uovπU"RJQ78P^x^8j*:,]T>_cvI2O./s00^]jIEJyN]h0Hzf:r6z[n?u')0.^9XZgvD<&πU"-#cXsMeT#gboWMScFQ/vk&oOS>9HmQfSX\HIdgVlE5Id2&.up(%)9%%[%-%>DdrπU"EplrC\E#%%%0%/%%1%%%%k%fijr%fxpS[ilnf]Of7;[E1*IHhOpHj*PmB)BI0L*πU"Gw-.f8dh+hAu;3'aH)'=RH#BW1l(v[0qYr)ACMoJomPh?K'9q'bM-7$XWo[QFIUπU"]L9+aotWmlA&t2.L$+&p$qx1s26T)-w*3dzW\ceR6PeNgo\\m&6E=yIrVf2C_&rπU"izwIXAn.r3j*5gyr%]1yc;OHgA<s..l3br_]2#sSDK_gYW;nUzhs<_)_#t*b_p7πU"bVUFf+tk1T8Ldr>iBNS2_2FDdrpawJRVsRL**x<u%p()9%%%%-O%RdrREBs')ibπU"&%(%0/%%%-%%%%kfi%jSilsn.OF,<?E1d%uIf*>6pCbop1I::Ig?fG=l,J*yyR.πU"BU/-8yyMm=vkcDmcerrowobl?n\^bf&+u6+f-Nn]]3JCr+t$B)pc_.oBh_l8[g_πU"omRMA>3EATFpXtE'?8%10>9IsTgwA^+'Gy3/p%i7hXnW7tMK8t_)tEZmK4flMLmπU"4q50KEPb?cd5N6dUZ(5J-cW16&dX/Hbv05qU%]#ov7YtXcEG9cy>tB+E<cAq_NcπU"$:K7V=yZ7i2i4vg]R;c>#B6zy*)$AeC_=Nc(+X3CbVf_%-TBI_M&1u5tw%Gvi#+πU"q._*3hlK[,?>\6ffpm.b#Em05YGJ]0xD*3_t7l#]Lh1LfBUMn+-E9#B4DH+t*5tπU"Au&sFHMD+:R;L<*b&.SQ]6m?CFj8;I>Xa#2lN[nKxK#.:cFMI*hfmIH\>9lap*1πU"HIJ14c4beL6nBh?lrR3hOG+-\*>Hh$j8EZ>R&5CvH<[mMwOlSMWOE3MU>m5LvH,πU"#7R/$'JbNK&E6>=d,29D<\T%up()%9%%%R-%nU&sEZ_-J8?'%%%Q.%%%-%%%%ltπU"%wrSidln\M3F\lUd5%/#.gmh0,f2E5T0Yi=?T:oe+:UQvmgOk^(zc;G24M;XE/(πU"[r$VLalhH5;5uuvlT*2.dd)NK]#YjtHwuZL-coW(Ue?6cDHJCt?BTla44\(C83tπU"HTAFa0#H]2C(M*fX?f=qo#<)(]U&(&1PZ#[G?mXu)FrG;Pu#*Zt[>tekpdIoOSiπU"F47*A;^C&k=>LX^xEPAAVS#9+7%w]1)_Vl:KMG;0[^MdNZ0)4iYLkPVDL)^F__cπU")DJ(lUkKd<HD=J\v#u<Wz-U\9Im.O,Bj/QbKJh#Q$F*VAmWruuim+IA%U?l=5<$πU"5H7GM(fqC98a)2yQ>jI$/t6#Z;S*AP*YIbYMtL(OHOLK:q(k4g*VuY5FSQp#]3NπU"RMW(_/,p=<.;?[+m'd48t#U?QA3]mg7cN_[2$Fa2I;]Y]OE'6eQl%NfRy&gYx:eπU"%NrmuT9Sjs.LFiA4V?49B^X]89dXe$gN9aGiAPWJ$ST\\ph+?$aC$q80glWhBI;πU"lTx6,D47Qv)Ib4CVoRY&LJC08W2V4>^OB<8,2pL$_8=Lq5.YB$zEwK242Ka':R[πU"wcE=UU:uRfs0UjCcYlEay&pOq&0MK4K6jV8oHrgw%ij[Z125+D+.$$Qc+ajll3lπU"(5t#rrQtmo^%TI^KLyPCDrm0AOIE8$D6t.i/cud3k5)<5>VNQd%up()%9%%%#-%πU"PWnsEHb:ls-%%%%Q.%%%1%%%%lt%wrrf%xpSimln>N0J2RUm1)IdJ6,0Wt=IV3dπU"OPomaPK^*CTVo*:pKYa#$K-#feT/4(d>4Y2Y?rGmgz_o4,(T#L.jQodphY_gov(πU"B4F;DQn#^-0Qwr[?;,fq#AS8)bX?Ci91/J=2i$i(kB[^M4F/,h0&&p#GgA];R*ZπU"9so=\260<<z/c7-8/FEm7>[#j:AV=5vU&1<^ACKGz.UaVdgQ=BdxwGa6C]cLM8BπU"EMVUfgOf%H'i2up%()9%%%%-%+o)wF9T_u;&i%%%'\*%%%.%%%%xpzq%qSrxsp.πU"KJ(2RU1X)I\r+x*1HbC3s<FOAm8,3R<$;gy]P)DmB3qIKW96wSe:n1<uHV70)8SπU"b6\]gNC2%A%b*ntj669J%vwA?=e/QMAcq\5BF=+1-N8]LC;pEcaaL6eTMNlG=tAπU"tGcQT&<24nfQ'&zfA<a\vl>2#1g;s7n?vxRKI(KX:fqFjvUr5/Q<d%]6LPDJR*wπU"7tu%p()9%%%%-O%Yu((FPa'+j8%%%%k&%%%1%%#%wj%%nxnt#sSy'1y\]f+p<e5πU"kThPuVVFDt#.rjpNWQ\vJyuYGiV5-KbTFsQWVYwJ78)nEfaA67YHX<>-,$eTKICπU"JjlGQo=GP([)rnGM=hg6HouEi21e[LUTZ($3)?$RGIo[s#BRVv7^Ut,Kh2-0B:hπU"3TI4<6(+o-UT58tuDBR13P]K-+shxQx#BlBGdb\.-*<^4?d/i('2iwp9V/Rsb-NπU"ji^'o0_=$T&WW53jNl\NVTLfJ:nOsmO14W,E0vqM%%up()%9%%%m-%P&S(F(q55πU":v2[%%,s%%%/%%%%ii%qtlt%SkxnNf+<Ac\1:]749wx]tL$4HBw*?7^(IA<;bBFπU")AYZnfhB%+;LX]-\xoz3#Dm/csJR+,pHHonM%\<XhqW58eMD/k6X_nr6Luvv#M9πU"/T(gpuM.9/Tg&puM9C/Tgp%uM9//Tgpu#M9/T(gpuM.9/Tg&puM9C/Tgp%uM9//πU"Tgpu#M9/T(gpuML9Y>S9O=LMfWsn.XoYT0*%FS[,Y0Fj$h,wvB66hCgSK^mrn5LπU"uljaql^SuX'NcR't7VS_\tKeg5f^JZaLB-LGXYG$^ReEaBsc?,FZE1mILVP^\tFπU"?m(1bKdaUTz2IsU%5lex$f8flw8Pp]>Ec$m\YN[zFztUXqvAQ'gGrhl\vOVdm8:πU"ra5Fd]bX-WZ4L>\*tLGU?kg14<ZNJ_eZpF*.b?wCrCXts7YlP,N'%,+0ND'j^#vπU"$M1bgRSSW#[B(^5mCUV#7vq+S8]ohw/WLCZ/(X01[q&2\jy:\_N(hVFl:0fm/a>πU"tBf[qU;-lTr3>4uHm[\rQuYPh^$K4R:S.tj-V,0DBnT5%<o-yIQRgeK'Y('/Z4sπU"z_X=8t</qH#aWZqiFkG=r7FX\Fi-*N9#4_?Qqb>^Zcw)m(s41M/e>8>q_sYFj?sπU"LGDSpvi$&)XN)4q?qG=i0,]GGaKx-j,[gDR;[G#M*aJV4f>>cLEs5LRFyBol,+&πU"sS_S<i0BF1uMQ;(q2(MCG?:c\q4g0-4X_gi[NK.)OR]6)TJ/>U,GTkC]WK_:jKoπU"ja9B[GMS#^$FoCt3YNj>b+1IP<trwK?D<ue09Js<hWBm5;f'+nyjsPoHneQZ(g:πU"B%8Gq2GB)DuTU1j7O1ZTHFx_a9rUGV1rQ-X#8ilkuBA+)EA+4o[DQAW.rtehus6πU"77R'EQ_vi4KKKh-4Q6i>65Y1oR)&ah4kMeUu$W$^%-WRYm6>aUfP'[$XoN?2cTEπU"Sij8d8cHrbj%nZGIuU*AjVJb,]8Qg&CJ\H]'vN6T_R1<]Y5I6k)_rM;i<SNGaD<πU"u#.<iV%2OSI[W8YH+]7_X(V':6SE_qarpPw5k+=#Gt&>?X0KuL(]MP\=pmV4j7UπU"u$/H'<<XlCV:UcUtPQ8Fw\0-:F#^['#DAN5IAX??gdF'</<bq[C\Xs8-yBoC[VSπU"MSSl3w)k-MVDG6;q2)JHGT&0$WX#3&S8Ln6C5hkjQNt0l'ajlG6/zR&^G*1?q7fπU"_WS*$5SI84&=k*lzTvkJe*3GjzFkLK6,u3<jO623R+m*>q%(+$C_M6>9q[MDS/bπU"Ch+*j'n]nVpDdFPw+*D;NIR.C,Nl192p5ICjf5hqo\*A&[Ndn^F4qA<F]a=eL&uπU"_JCxqqe'GEdHvYcO-(;6#Fo4g,H<I^L:Dfc9wVc<4;/dxV6wJ)4NNoj3LrA(MN'πU"A9MtX:ttflaUh?cc923KyYs+<^0$]K=^t+KgO1eV]Q'Zbdq2P[?L$<*^0R9]%CNπU"gss$;7='C%5pb7tp?a__Gxl4A)'oUO0?e_^7V<2DOyfUM'B=_OkHc%S?AOf1?WRπU"dV*CD^qhx<.#bs2J(=+N\2hF<V-NYc)\PdIBH14vQmIh7KAXco3b\qB(uTaJR>0πU"b]>,$Aa_G^m+#UV%XuHBepK_8OpIU$J<%.J$269vkgoBkwL*W+:3*:dXRacs<rWπU"&dzTBQ'+i7.?v&?])pp>R>xj6\=MOJ=9C$Q1$8XWUOL#c,[V88C5ENx<Uj;D8a3πU"0RG&Et.)tfPL0/1D.e?Lv.RxS;hawYp(Pm/-WQ8*iw='IiJ<b,^<_>t:j/bD<=kπU"#;XMeRb4S#SLu']4XHbYt?7bChZFu]jRL*+CDy&^_3k;#p4xlQV(zm<r9fTW3#YπU"%Y/D;1&(FqD^GJg%FJJ0Z^;3v,Rp%ql6fB]djNU)ZWUfG1m%dTJ:812\HWCl#9gπU"luS26Rm8o$9NEM4G_JbEgyuiT]m&h.[l#o)Ob:BsZNG2g6wcH+Fe.jWg]2f;kd9πU"GT^K5m0N&:VM8_)=;Auu/egIU=(-?;t]p##$c);\GLrojK']S(KLRu;u%8?I>qpπU"2Y1t0sK)ZsPqYB5&fR18u5]:DaJ4,HvYNsP)Z7hd/MU2].H)fz'PW$xE2tv,PmgπU"o,GFJ\m:FnB6:$tq7YIAlV<6:<uc)A9-cM)0ZaS&g+Z1YMPT1haY^WL1EMxpB?3πU"mK(U=*>iVfMmBUdFRT$.<Ho'4]tWh8WpIQ]B_i3>8Jc1Ru&f9WxuJD[f1S+&+QsπU"b1tS_Z^imHRJeKoQhYRhv2Pp%>_Z1qEjYK0>XtlH,hDB8pjHJt)AfT:SuHtC7(\πEND SUBπSUB V9πU"d5Z]vlaMjqfehgkun6A%%7#h^AsYI._h9T&2SNa4;4hTy\.[xFrjZDH.\\(,2U:πU"l*NK.1LA>X=ga,H7U7KaFwK;g=E2<8JD%m8nP11s*3Vo;#kHvQze=?qsAGrRs>DπU"g_f=/W8h,g#-eZO$F-,io'3X1[f_RSS1iFUI$>o[J)\B>^6O?C(iy5=P6-O\oEnπU"k3Qlc[oYhg#p3HgBK3=Kx5^];UZL#SXk6uUhU2&2\F3b=*a<H76$R]*WBY;aOmsπU"t2]Kbvy$-uX]A2\:xZSg0/[fxOv#iXw8tJ;\r4=wGAQS^JH[ATEaa9&o.<nlC<ZπU"lvGZDU49s0Tw(>)W9Tw209%t-U)COr^*c?Ec1dV*33#=jG-:O<goEn[6O$iQ#?IπU"OqtK88TDj?AJd=$m5>[,,a\F5u3YvUGTe]q5(41U&hU(nFiiVK_FZ()7xcr&_T+πU":svMW<\oTs6.H<;7bey)$1l&,<[G2Q%Q=?4;*-c0XEt$4wl&>HNYAtXsXi;:y;)πU"x+E)<3f$bym1R?2^4ir[/44f%n+A:yO28z\13%PtTdqS\[O.LssCraD;u'ta>9LπU"Zq'gHs;c2)BOM5&FGg6jSaTCcR^.4m=4:'G^60;&%>meB:Q(rY=c9<T58x^1Q^1πU"#TrJmt#gNXejE8pgUJt$Bv7R:p#[3j0X]jk4N2r8Ln5iQ/('%7&+Mh02=e'</uAπU"MJ\\,P^f9q8r#TW.e*/7j]cSSro*Q;z'22yHOZ4#/yB*4&4+H+T?Fd<EVKEog>QπU"fM(fit02Val/KD7YK9:7])eC;#dPHCeu3X)$DsM<);C^chd,rRV1lZ>:0a3Om$<πU"hAggM##d\Q;p'#q9_S2[')K8dzmhhnamuM4:eZ)2xsS#l1M+Da&cJpoKr%%iu28πU"wps7DMOoqp%nwB^^>jMV2p*jKUBnBUK.2aVN&llrcev8=<.w9NGl_U^dr;cRTYPπU"eqdF)pKz*.Tn&%Q1\DrG4VTeCTgIg<oQqM-p#BdS^(RX_5^nP4i0Rc\oi6gc2TzπU"HIbUw:/PvuS*^>dal%wE(0_<5:tN[iM?rZO-gtb8&=Ldg,.Q6#/sM:1ZiM8yYOZπU"Dchm8Z_nMikerGPYY0pdky3Ehakv5WqkC1?_0U]Sw$#rCguxQHUEcI1vg.5'R;xπU"^V=M%'kn[qS\,a59≦H)0GNN<Cgdu7%Q?*;k+QHXL9IVc4qQ0D1B:2Od-lDM:πU"EO/#37[JjzU<nEpRyLq=ImaimfTtVGO8TcW/Mq'e6hkSX9qC7<b\?R)=J_PVfxLπU"VhPD(9qvHO$'I&^[TPWTYmE62rbL9T$O;CdDR?p<NqK'QFR$1g[PEK'>O8E.JXbπU"xju.V0#a[hzBU(vCZQ6Hr5l4;Pti#0Gaqn9/sJ+Oy2,U<_Ur5ge8U*L%l^tfSeuπU"P<(H;U,D4cnNMsVT38DkH6F]7/vf<o$#iE0lFvA],u3%7*TX)E0ekBi+C0C.1tJπU"lp1[as0cFXxW^Fvd:w:g.XCJqHIn;Zp_vrt5]]QRLXP8k^_Rdv?Y8V%#bvpp&rwπU"-s]W2cTOQ8LF0E#.P-W2F-L8-UThXbA'm74wAYDfuT[/j^v35AH\MKXgPkPpeE]πU"S.OvEg&+9Ylp&L)?kvFjlj=Ea=jR]h%ci44.x4DpU$Knr#:B8w/LcRc3t0XU^3<πU"T26$*w#ZG:6W#\t(kc,%MVcl,K(uW\x52PfMA-Zl$o,O:sn$qP*GqzaheVnj[nuπU"i1($VK=B.c11&7fPcZbVj?/[L^?UM_O2jWuD_lZ<rj6URATN]47101>VioVm9XAπU"nZE)WRRZ;+H#(&4;?;eT(I=CI7sqqZwV>+QoB5J/J?*I_Ba+qvw&FnT?-rL*'QBπU"7rIo1Kp4ng4^mjBI&kZYp)_=0chvErJ4P*XR2Nm9/>0]>tdxrn>8uOWw;ist\X^πU"56lfDRdZqt]Z6rl=XxrviWiMwZkx5e(4WtdljX.ClH;2r=#-Z,_'9?kKP9yve^9πU"y^'Ad$idqZNk(\.D.-w2NO.Pq]7CBN[N2EK9/8>pvR$q:KwP5Wi(hVNIvfFK%rSπU".Xr1Nr43XA$qKN[A>zx%xM9//Tgpu#M9/T(gpuM.9/Tg&puM9C/Tgp%uM9//TgpπU"u#M9/T(gpuM.9/Tg&puM9C/Tgp%uM9//Tgpu#M9/T^gpu5,[x&u%p&'9%%9%%#%πU"-%CE1%F1t[Xn,%H%%z'p%%/%%%%%%%%%&%%E%%%%%%%%%ifw%fmVS%gfxu%p&'9πU"%%9%%[%-%n*/%F1U4XlO[%%%6%%%%-%%%%%%%%%&%%E%%+%TH%%%rfy%ySxf&%uπU"p&%'9%9%%%%-L%=MVsE<bm-iX%%%%$+%%%,%%%%%%%%%%%E#%%%P%I%%q%yVSi%πU"lnup%&'9%%9%%%R-%;M&VE143Mkr%%%%P)%%%,%%%%%%%%%%%%E%%%&TJ%%%qyWπU"S%ilnu%p&'9%%9%%%%-%0_NVE4K7^>8[%%%D%'%%,%%%%%%%%%%%%E%%%%rK%%%πU"qyX%Siln%up&'%9%9%%%%-%1UYVEg/9d1'm%%%%$+%%%,%%%%%%%%%%%E%7%%TKπU"%%%wy%VSil%nup&%'9%9%%%%-L%RYV(E/\=)Sr%%%%P)%%%,%%%%%%%%%%%E[%%πU"%m%L%%w%yWSi%lnup%&'9%%9%%%R-%CYAVE(A128=%7%%D'%%%,%%%%%%%%%%%%πU"E%%%'5M%%%wyXS%ilnu%p&'9%%9%%%%-%>D[VE,Bt7%E['%%,%:%%,%%%%%%%%%πU"%%%E%%%%tN%(%&fV%Siln%up&'%9%9%%%%-%3)[VEIgQGK%Z&%%&B2%%%,%%%%%πU"%%%%%%E%7%%cP.%%&f%WSil%nup&%'9%9%%%%-O%m[VmEX6w(OI%%+%l,%%%,%%πU"%%%%%%%%%E%%%%i#R%%&%fXSi%lnup%&'9%%9%%%d-%?.\%F;K2o^Q:I%%EA%%%πU",%%%%%%%%%&%%E%%%'\R%%%jsVS%gfxu%p&'9%%9%%%%-%y)NVEeJW)mL%&%%$%πU"+%%,%%%%%%%%%%%%E%%(%Yh%.%q&V%Siln%up&'%9%9%%%%-%1KOVE*Px9q'q%%πU"%%P)%%%,%%%%%%%%%%%E%%%%Qj#%%q&%WSil%nup&%'9%9%%%%-L%BOVOEB[7)OπU"b%%+%D'%%%,%%%%%%%%%%%E%%%%n%k%%q&&XSi%lnup%&'9%%9%%%#-%BZAVE=#πU"5]oF&%%%$+%%%,%%%%%%%%%%%%E%%%%&l%%(w&VS%ilnu%p&'9%%9%%#%-%,_ZVπU"EMomEpg%%%%P%)%%,%%%%%%%%%%%%E%%(%lm%.%w&W%Siln%up&'%9%9%%%%-%2πU"qZVE<s<=P&f%%%'D'%%%,%%%%%%%%%%%E%7%%)n#%%w&%XSil%nup&%'9%9%%%%πU"-O%;GVXEuGw%:k%%%%8G%%%-%%%%%%%%%%%E#%%%;%o%%g%fhpS%ilnu%p&'9%%πU"9%%[%-%'$-_EV?rWix[%%%l%'%%/%%%%%%%%%%%%E%%+%Qo%%%xqn%rjVS%ilnuπU"%p&'9%%9%%#%-%0E'dEc#7a5c#%%%j%&%%/%%%%%%%%%&%%E%%%%xp%%%gwn%hpπU"ZS%ilnu%p&'9%%9%%#%-%])cjEb:R/J)%&%%^%9%%1%%%%%%%%%%%%E%%%%4q%.πU"%q(x.nf.q%VSil%nup&%'9%9%%%%-U%:.%sFQF?+W*A%=%<-%%%/%%%%%%%%%&%πU"E%%%%b%r%%i%fwfm%WSgf%xup&%'9%9%%%%-L%uIV^EiP]'G]&%%%$+%%%,%%%%πU"%%%%%%%E%%%%;&9%%q%iVSi%lnup%&'9%%9%%%I-%b[/)Ec24AOU%.%%j&%%%/%πU"%%%%%%%%&%%E%%%)B:%%%gwnh%pVSi%lnup%&'9%%9%%%I-%yJ&VEjd=9)d%%%%πU"P)%%%,%%%%%%%%%%%%E%%%(F;%%%qiWS%ilnu%p&'9%%9%%[%-%q_JVE[Q3YRX[πU"%%%D%'%%,%%%%%%%%%%%%E%%.%V<%%%qiX%Siln%up&'%9%9%%%%-%3;OVEX'5%πU"k%S&%%%$+%%%,%%%%%%%%%%%E%R%%X<%%%wi%VSil%nup&%'9%9%%%%-I%>PV%EπU"=xs-Y\%%%%P)%%%,%%%%%%%%%%%E%%%%W&>%%w%iWSi%lnup%&'9%%9%%%I-%CPπU"/VE6Y/,z[%7%%D'%%%,%%%%%%%%%%%%E%%%(_?%%%wiXS%ilnu%p&'9%%9%%#%-πU"%;_HVETQJ\7X['%%,%:%%,%%%%%%%%%%%%E%%4%d?%%%ifV%Siln%up&'%9%9%%πU"%%-%3\HVEWscUl&S&%%&B2%%%,%%%%%%%%%%%E%I%%hB%%%if%WSil%nup&%'9%πU"9%%%%-I%bIVLEncV,D(%%+%l,%%%,%%%%%%%%%%%E%%%%g&D%%i%fXSi%lnup%&πU"'9%%9%%%I-%_8#iEgO1dFb%.%%j&%%%/%%%%%%%%%%%%E%%%(;E%%%gwnh%pWSiπU"%lnup%&'9%%9%%%#-%AuRiEck500.(%%%8G%%%1%%%%%%%%%%%%E%%%*JE%%%qnπU"gw.fw(W%Siln%up&'%9%9%%%%-%)7uiE0Q>I0&H(%%%8G%%%0%%%%%%%%%%%E%IπU"%%)I%%%qn%gwfw&(Sil%nup&%'9%9%%%%-U%>'(4F1?W'hr(%%%\.%%%0%%%%%%πU"%%%&%E[%%%u&L%%w%jxyt%wjSg%fxup%&'9%%9%%%m-%d.\_E\b+\0('7%%40%%πU"%1%%%%%%%%%%%%E%%%)AP%%%xpjq%jyts%Siln%up&'%9%9%%%%-%5D.%F-'N[dπU"&X9%%(\:%%%,%%%%%%%%%&%E%I%%nR%%%js%WSgf%xup&%'9%9%%%%-R%M/%=FlπU",.%?e%%%%k%%%%.%%%%%%%%%&%E%%%%r&g%%q%nymW%Sgfy%up&'%9%9%%%%-%3πU"_IGEn_$U3&F'%%&Q/%%%.%%%%%%%%%%%E%R%%-g%%%mz%rfsS%ilnu%p&'9%%9%πU"%#%-%k*.%FYixxBt#.%%X%R%%/%%%%%%%%%&%%E%%.%wj%%%xjq%jhyS%gfxu%pπU"&'9%%9%%%%-%h)s)EOFxAN^#&%%Q%/%%,%%%%%%%%%%%%E%%1%Dt%%%jqk%SilnπU"%up&'%9%9%%%%-%5c'(F=7APe&B)%%%k2%%%.%%%%%%%%%&%E%#%%Nv%%%ns%ywπU"tS%gfxu%p&'9%%9%%#%-%q$.%F>N3Ebe%-%%w%B%%.%%%%%%%%%&%%E%%4%<z%%πU"%yny%qjSg%fxup%&'9%%9%%%I-%;pJeE<E<Yc_%7%%w'%%%.%%%%%%%%%%%%E%%πU"%,O-%%%qnym%WSnh%tup&%'9%9%%%%-O%djV:EGO&*,x'%%%0W%%%-%%%%%%%%%πU"%%E#%%%\'.%%q%nymS%ilnu%p&'9%%9%%#%-%d$.%F/tk;8[[*%%7%A%%0%%%%%πU"%%%%&%%E%%:%+1%%%tuy%ntsx%Sgfx%up&'%9%9%%%%-%5?/%FK?#(u&a%%%'+&πU"%%%0%%%%%%%%%&%E%d%%67%%%tu%ynts%xSlf%rup&%'9%9%%%%-X%;-_RE+pW-πU"]F%%+%l'%%%/%%%%%%%%%%%E%%%%G'8%%w%xqnr%jSil%nup&%'9%9%%%%-L%aoπU"^FE%kZ')K'%(%Q/%%%.%%%%%%%%%%%E%%%%<'9%%i%jrts%Siln%up&'%9%9%%%πU"%-%)kXyECqG&%'.&%%&Q/%%%.%%%%%%%%%%%E%d%%3;#%%i&%fwkS%ilnu%p&'9πU"%%9%%%%-%P\\yEj;_UI4#&%%Q%/%%/%%%%%%%%%%%%E%%7%e=%%%xuw%nyjS%ilπU"nu%p&'9%%9%%%%-%;E3_E:JnZm^#&%%b%0%%.%%%%%%%%%%%%E%%:%F>%.%q(x%πU"nfSi%lnup%&'9%%9%%%d-%H.8%F%U(w3d).%%51%%%1%%%%%%%%%&%%E%%%+R#%πU"%%knsn%xmji%Sgfx%up&'%9%9%%%%-%4x.%F/i&r+%](%%&Y1%%%0%%%%%%%%%&πU"%E%d%%eD%%%hn%sjrf%VSgf%xup&%'9%9%%%%-L%ch9jEwPp(./%%+%a(%%%-%%πU"%%%%%%%%%E[%%%p'G%%x.pj(S%ilnu%p&'9%%9%%[%-%eDeGEt)yRve#%%%j%&%πU"%/%%%%%%%%%&%%E%%:%LH%%%gwn%hpXS%ilnu%p&'9%%9%%[%-%i)c)E?bW8?]#πU"%%%Q%/%%/%%%%%%%%%%%%E%%=%^H%%%qnq%nymS%ilnu%p&'9%%9%%[%-%A_$[DπU"b8A:dS#%%%*%%%%/%%%%%%%%%&%%E%%=%jI%%%hzw%xtwS%ilnu%p&'9%%9%%#%πU"-%4_b*ElUt$MU%)%%8%G%%.%%%%%%%%%%%%E%%7%lJ%%%wtt%rVSi%lnup%&'9%πU"%9%%%I-%:Rn)Ei3+84T)%%%8G%%%0%%%%%%%%%%%%E%%%-mN%%%wttr(V.VS%ilπU"nu%p&'9%%9%%#%-%tDlCE9Sgp=u%&%%.%5%%/%%%%%%%%%%%%E%%7%qS%%%hns(πU"W.fS%ilnu%p&'9%%9%%%%-%/)f9E<U,U0)[%%%t%(%%/%%%%%%%%%%%%E%%7%?UπU"%%%uty%ntsS%ilnu%p&'9%%9%%#%-%_*.%Fd2l1cG[+%%d%=%%-%%%%%%%%%&%%πU"E%%:%kU%%%rfu%VSgf%xup&%'9%9%%%%-R%I0%(Ft+b,yn'%%%/-%%%1%%%%%%%πU"%%&%E[%%%]'[%%h.tu(w%nyjS%gfxu%p&'9%%9%%#%-%OE.%FfF7R):[5%%]&4%πU"%1%%%%%%%%%&%%E%%7%(_%%%lfr%jrjs%zSgf%xup&%'9%9%%%%-I%(z;IE,V=+πU"#I&%+%D7%%%0%%%%%%%%%%%E#%%%g'o%%q%zhnk%jwSi%lnup%&'9%%9%%%I-%0πU"xSCE5I/fxo&%%%.5%%%/%%%%%%%%%%%%E%%%,$q%%%hnsW&.gSi%lnup%&'9%%9πU"%%%I-%Ru8(F84=v=8,.%%<6%%%/%%%%%%%%%&%%E%%%,(s%%%wjfi%rjSy&'yupπU"%&'9%%9%%%[-%g'A(Fv03l<_87%%So%%%-%%%%%%%%%&%%E%%%%e'&%%mjqu%SgπU"fx%up&'%9%9%%%%-%1bbPE)o)_*&L%%%'$*%%%-%%%%%%%%%&%E%7%%o:%&%mj%πU"quSi%lnup%&'9%%9%%%R-%odSPEM6:7;#%.%%j&%%%/%%%%%%%%%&%%E%%%&h;&πU"%%gwnh%pYSi%lnup%&'9%%9%%%#-%Mt\VEQ^=(p8'7%%,:%%%.%%%%%%%%%%%%EπU"%%%&W<&%#yfV.%VSil%nup&%'9%9%%%%-L%BtV.EL;H,x2'%+%,:%%%.%%%%%%%πU"%%%%E#%%%=%?&%y.fV.W%Siln%up&'%9%9%%%%-%2ftVEE1v8_%z&%%&B2%%%.%πU"%%%%%%%%%%E%%%%sB%&%yf(W.VS%ilnu%p&'9%%9%%#%-%y)tVE8OC'i'#&%%B%πU"2%%.%%%%%%%%%%%%E%%+%CC&%%yfW&.WSi%lnup%&'9%%9%%%I-%8c&jEzr>.FHπU"&.%%Z9%%%0%%%%%%%%%%%%E%%%%nE&%(q(xn(f.qS%ilnu%p&'9%%9%%%%-%uE'πU"(Fb)ZQD>[&%%j%)%%0%%%%%%%%%&%%E%%%%fG&%%hwj%inyx%Sgfx%up&'%9%9%πU"%%%-%+l)wFLOZp/%X'%%'\*%%%.%%%%%%%%%%%E%.%%RH%&%xp%zqqS%ilnu%p&πU"'9%%9%%%%-%;_bXES>YJhx%&%%8%G%%.%%%%%%%%%%%%E%%+%VJ&%%xuf%wpSi%πU"lnup%&'9%%9%%%m-%n-J_Efd<P'G%7%%l'%%%/%%%%%%%%%%%%E%%%&&L&%%lxqπU"n%rjSi%lnup%&'9%%9%%%[-%G.&_Eh#<\0D%7%%l'%%%/%%%%%%%%%%%%E%%%%rπU"M&%%gxqn%rjSi%lnup%&'9%%9%%%[-%u.\_Egm8G6F%7%%l'%%%/%%%%%%%%%%%πU"%E%%%%eN&%%ixqn%rjSi%lnup%&'9%%9%%%d-%g2S_E+*>H:M%.%%b0%%%/%%%%πU"%%%%%%%%E%%%%ZO&%(q(xn%fVSi%lnup%&'9%%9%%%[-%P1n_El6(1I/&7%%40%πU"%%-%%%%%%%%%%%%E%%%%VP&%%xpjq%Siln%up&'%9%9%%%%-%3>drEYprC\'E%%πU"%&0/%%%1%%%%%%%%%%%E%.%%0Q%&%kf%ijrf%xpSi%lnup%&'9%%9%%%R-%Rd\rπU"EBs2'ib&.%%0/%%%-%%%%%%%%%%%%E%%%&&R&%%kfij%Siln%up&'%9%9%%%%-%πU"3nUsEmZ_J8%?'%%%Q.%%%-%%%%%%%%%%%E%%%%5T%&%lt%wrSi%lnup%&'9%%9%πU"%%#-%PWnsEHb:ls-%%%%Q.%%%1%%%%%%%%%%%%E%%%%uV&%%ltwr%rfxp%Siln%πU"up&'%9%9%%%%-%+o)wF9T_u;&i%%%'\*%%%.%%%%%%%%%%%E%%%%SW%&%xp%zqqπU"S%rxpu%p&'9%%9%%[%-%YDu(FP[a'j8%%%%k%&%%1%%%%%%%%%&%%E%%+%hW&#%πU"wj%%nxnt#sSy'%yup&%'9%9%%%%-X%P&(OF(q5*:v2%7%,s%%%/%%%%%%%%%%%EπU"[%%%Q%X&%i%iqtl%tSkx%nup*%+%%%C%,%,+%w8%(%vf&%%%%πEND SUBπV2πV3πV4πV5πV6πV7πV8πV9πCLOSE:IF S=117AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπBrent P. Newhall WORMHOLE comp.lang.basic.misc 10-15-96 (21:26) QB, QBasic, PDS 639 20559 WORMHOLE.BAS' Here is the updated WORMHOLE, including a lot of the improvementsπ' suggested by a lot of very nice people. Thanks, everybody.ππ' Weird line lengths are still a problem; there are no REM **********π' this time, so you'll have to go through it yourself. Sorry!ππ' This starts to bog down with 10 baddies or so running on Visual Basicπ' for DOS on a 486DX2/50, so I've added several comments as to whatπ' should be increased/decreased for QBASIC users. Do a word search onπ' QBASIC and you'll find what you need. If it's still too slow, you'llπ' have to REM stuff out on your own (start with GOSUB DoStars in theπ' DoEverything: routine).ππ' Sorry for being lazy, but I'm really busy at the moment! Thanks forπ' your patience.ππππ' Wormholeπ' Version 2.0.0π' by Brent P. Newhall (bnewhall@gmu.edu)π' This program is PUBLIC DOMAIN. Anyone may use it however theyπ' wish, provided that credit is given where it's due for coding.π' One day, without warning, the heavens next to our planet openedπ' like a flower. Out of this wormhole came an alien delegation,π' their only wish to sign a treaty with us. We sent our entireπ' starfleet to the wormhole's mouth in this treaty's honor.π' Then, out of that wormhole poured ships the likes of which we hadπ' never dreamed. Our fleet was decimated; most ships wereπ' destroyed, others pulled into the wormhole to fight on theπ' aliens' ground. But we had made our mark; the half of theirπ' fleet remaining withdrew into the wormhole.π' Now, you man the only spaceworthy ship left. Your mission:π' destroy the aliens as they come out of the wormhole, as theirπ' weapons are useless for a small critical distance from theπ' wormhole's mouth. They will be defenselss unless they getπ' past you. Good luck!π' Your ship can only move in a circular orbit around the wormholeπ' out of which the red aliens are coming. Use the left and rightπ' arrow keys to move around, [SPACE] to fire a missile at theπ' aliens, and [ESC] to quit. Hit [ENTER] to bypass theπ' beginning, and [P] to pause. Your score is displayed in theπ' lower left, and number of aliens destroyed in the lower right.π' Blue ships are our ships returning; let them pass.ππ' Version 1.0.0 -- Original release.π' Version 1.0.1 -- QBASIC compatibility assured, unneeded variablesπ' removed.π' Version 2.0.0 -- Longer missiles, multiple missiles, blueπ' wormhole and discontinuities (long blue things),π' improved explosions, fading title, improvedπ' score handling, pause function, better graphicsπ' handling, blue good guys, history, QBASIC info.ππ' My highest score: 6882 points, 94 aliens destroyed. Beat that!ππTYPE MonsterTypeπ x AS INTEGERπ y AS INTEGERπ degree AS INTEGERπ radius AS SINGLEπ exist AS INTEGERπ dying AS INTEGERπ MonstType AS INTEGERπEND TYPEπTYPE StarTypeπ radius AS INTEGERπ degree AS INTEGERπ colr AS INTEGERπ special AS INTEGERπ length AS INTEGERπ speed AS INTEGERπEND TYPEπTYPE VertexTypeπ x AS SINGLEπ y AS SINGLEπEND TYPEπTYPE PolygonTypeπ BorderColor AS INTEGERπ FilledColor AS INTEGERπ filled AS INTEGERπ lxo AS INTEGERπ lyo AS INTEGERπ NumVertices AS INTEGERπEND TYPEπTYPE MissileTypeπ radius AS INTEGERπ x1 AS INTEGERπ y1 AS INTEGERπ x2 AS INTEGERπ y2 AS INTEGERπ angle AS INTEGERπEND TYPEππCONST PI = 3.14159, DEG2RAD = PI / 180πCONST FALSE = 0, TRUE = NOT FALSEπCONST TOT.STARS = 25 ' Increase for a prettier starfield effectπ' Decrease for QBASIC (to 10, say)πCONST TOT.MONSTERS = 20 ' Decrease for QBASICππDECLARE SUB DrawPolygon (poly AS PolygonType, verts() AS VertexType)πDECLARE SUB ErasePolygon (poly AS PolygonType, verts() AS VertexType)πDECLARE SUB RotatePolygon (poly AS PolygonType, verts() AS VertexType, angle AS INTEGER)ππDIM Monster(0 TO TOT.MONSTERS) AS MonsterTypeπDIM star(1 TO TOT.STARS) AS StarTypeπDIM ship AS PolygonTypeπDIM ShipVert(1 TO 11) AS VertexTypeπDIM Missile(1 TO 12) AS MissileTypeπDIM SinLook(0 TO 360) AS DOUBLEπDIM CosLook(0 TO 360) AS DOUBLEπDIM MonstGraph(1 TO 1000, 1 TO 2) AS INTEGERπDIM ExplodeGraph(1 TO 1000, 1 TO 5) AS INTEGERπDIM melt(3000) AS INTEGERπDIM score AS LONG ' Can go up to 2 trillionππGOSUB InitπDOπ GOSUB MainProgramLoopπLOOP UNTIL quit > 0πGOSUB EndOfGameπENDππMainProgramLoop:πnothing$ = INKEY$ ' Mask out INKEY$πt! = TIMER: WHILE t! = TIMER: WEND ' Delayπnothing$ = INKEY$ ' Mask out INKEY$πGOSUB DoEveryone ' Take care of enemies, ship, missiles, etc.πnothing$ = INKEY$ ' Mask out INKEY$πGOSUB DoInput ' Take care of inputπRETURNππDoEveryone:πGOSUB DoColorsπGOSUB DoStarsπGOSUB DoWormhole ' REM with QBASICπGOSUB MoveShipπGOSUB DoBaddiesπGOSUB DoMissilesπGOSUB DoScoreπRETURNππDoColors: ' Flash monster and score colorsπIF beginning THENπ LOCATE 5, 17: PRINT "WORMHOLE";π IF GoingUp THENπ ScoreColor% = ScoreColor% + 1π IF ScoreColor% = 60 THEN GoingUp = FALSE: Staying = 1π ELSEIF Staying THENπ Staying = Staying + 1π IF Staying = 20 THEN Staying = 0π ELSEπ ScoreColor% = ScoreColor% - 1π IF ScoreColor% = 0 THENπ beginning = FALSEπ LOCATE 5, 17: PRINT " ";π GOSUB CreateMonster ' Create one monster to startπ END IFπ END IFπELSEπ MonstColor% = MonstColor% + 2π IF MonstColor% > 60 THEN MonstColor% = 0π PALETTE 101, MonstColor%π ScoreColor% = ScoreColor% + ScoreMoving%π IF ScoreColor% > 50 THENπ ScoreMoving% = -1π ELSEIF ScoreColor% < 20 THENπ ScoreMoving% = 1π END IFπEND IFπPALETTE 102, ScoreColor% + ScoreColor% * 256 + ScoreColor% * 65536πRETURNππDoStars:πFOR cnt% = 1 TO TOT.STARSπ tx1% = INT(star(cnt%).radius * CosLook(star(cnt%).degree)) + 159π ty1% = INT(star(cnt%).radius * SinLook(star(cnt%).degree)) + 99π tx2% = INT((star(cnt%).radius + star(cnt%).length) * CosLook(star(cnt%).degree)) + 159π ty2% = INT((star(cnt%).radius + star(cnt%).length) * SinLook(star(cnt%).degree)) + 99π LINE (tx1%, ty1%)-(tx2%, ty2%), 0 ' Erase starπ star(cnt%).radius = star(cnt%).radius + star(cnt%).speedπ IF star(cnt%).radius > 170 THEN ' Out of bounds?π ' Create a new star!π star(cnt%).radius = INT(RND * 5)π star(cnt%).degree = INT(RND * 361)π IF RND > .9 THEN ' Specialπ star(cnt%).special = TRUEπ star(cnt%).length = INT(RND * 10 + 15)π star(cnt%).colr = 9 ' Color special blueπ star(cnt%).speed = 15 ' Move it really fastπ ELSE ' Normalπ star(cnt%).length = 1π star(cnt%).colr = INT(RND * 15 + 16)π star(cnt%).speed = ((star(cnt%).colr - 15) / 5) + 1π END IFπ END IFπ tx1% = INT(star(cnt%).radius * CosLook(star(cnt%).degree)) + 159π ty1% = INT(star(cnt%).radius * SinLook(star(cnt%).degree)) + 99π tx2% = INT((star(cnt%).radius + star(cnt%).length) * CosLook(star(cnt%).degree)) + 159π ty2% = INT((star(cnt%).radius + star(cnt%).length) * SinLook(star(cnt%).degree)) + 99π LINE (tx1%, ty1%)-(tx2%, ty2%), star(cnt%).colr ' Erase starπNEXT cnt%πRETURNππDoWormhole:πCIRCLE (159, 99), wormholeradius1, 0 ' Erase old circlesπCIRCLE (159, 99), wormholeradius2, 0πwormholeradius1 = INT(RND * 6) ' Create new circleπwormholeradius2 = INT(RND * 6)πCIRCLE (159, 99), wormholeradius1, 9 ' Draw new circlesπCIRCLE (159, 99), wormholeradius2, 1πRETURNππMoveShip:πIF moving THENπ ErasePolygon ship, ShipVert()π posit% = posit% + moving * 3 ' Move shipπ IF posit% < 0 THEN posit% = posit% + 360π IF posit% > 360 THEN posit% = posit% - 360π ship.lxo = INT(80 * CosLook(posit%)) + 159π ship.lyo = INT(80 * SinLook(posit%)) + 99π RotatePolygon ship, ShipVert(), moving * 3π moving = 0πEND IFπDrawPolygon ship, ShipVert()πRETURNππDoBaddies:πToBeKilled% = 0πm% = 0πWHILE m% < NumMonstersπ m% = m% + 1 ' Loop through, 1..NumMonstersπ IF Monster(m%).dying THENπ PUT (Monster(m%).x, Monster(m%).y), ExplodeGraph(1, Monster(m%).dying)π ELSEπ PUT (Monster(m%).x, Monster(m%).y), MonstGraph(1, Monster(m%).MonstType)π END IFπ IF Monster(m%).dying < 5 THEN ' If not at end of dyingπ Monster(m%).radius = Monster(m%).radius + MonstSpeedπ Monster(m%).x = INT(Monster(m%).radius * CosLook(Monster(m%).degree)) + 154π Monster(m%).y = INT(Monster(m%).radius * SinLook(Monster(m%).degree)) + 94π IF Monster(m%).dying THENπ Monster(m%).dying = Monster(m%).dying + 1π PUT (Monster(m%).x, Monster(m%).y), ExplodeGraph(1, Monster(m%).dying), PSETπ ELSEπ PUT (Monster(m%).x, Monster(m%).y), MonstGraph(1, Monster(m%).MonstType), PSETπ END IFπ IF Monster(m%).radius > 90 THEN ' Outside orbitπ IF Monster(m%).MonstType = 2 THEN ' Good guyπ score = score + 250π LINE (Monster(m%).x - 3, Monster(m%).y - 3)-(Monster(m%).x + 13, Monster(m%).y + 13), 0, BFπ GOSUB KillMonsterπ ELSE ' Baddie, you lose!π quit = 2π END IFπ END IFπ ELSE ' At end of dyingπ ToBeKilled% = m%π END IFπWENDπIF ToBeKilled% > 0 THENπ m% = ToBeKilled%π ' Erase out last vestiges of monster graphicπ LINE (Monster(m%).x - 3, Monster(m%).y - 3)-(Monster(m%).x + 13, Monster(m%).y + 13), 0, BFπ GOSUB KillMonsterπEND IFπIF NOT beginning THENπ IF RND > MonstChance THEN ' Create new monster occasionallyπ IF NumMonsters < TOT.MONSTERS - 2 THEN ' If there's spaceπ GOSUB CreateMonsterπ END IFπ END IFπEND IFπRETURNππDoMissiles:πmiss% = 0πWHILE miss% < NumMissilesπ miss% = miss% + 1 ' Loop through, 1..NumMissilesπ ' Erase missileπ LINE (Missile(miss%).x1%, Missile(miss%).y1%)-(Missile(miss%).x2%, Missile(miss%).y2%), 0π IF Missile(miss%).radius = 0 THEN ' If at centerπ GOSUB KillMissileπ ELSEπ Missile(miss%).radius = Missile(miss%).radius - 3 ' Move its coordinatesπ Missile(miss%).x1 = INT(Missile(miss%).radius * CosLook(Missile(miss%).angle)) + 159π Missile(miss%).y1 = INT(Missile(miss%).radius * SinLook(Missile(miss%).angle)) + 99π Missile(miss%).x2 = INT((Missile(miss%).radius + 3) * CosLook(Missile(miss%).angle)) + 159π Missile(miss%).y2 = INT((Missile(miss%).radius + 3) * SinLook(Missile(miss%).angle)) + 99π IF POINT(Missile(miss%).x1%, Missile(miss%).y1%) >= 100 THENπ cnt% = 0 ' Hit a monster! (front end)π WHILE cnt% < NumMonsters AND Monster(cnt%).dying = 0π cnt% = cnt% + 1 ' Find hit monsterπ IF Missile(miss%).x1% >= Monster(cnt%).x THENπ IF Missile(miss%).y1% >= Monster(cnt%).y THENπ IF Missile(miss%).x1% <= Monster(cnt%).x + 10 THENπ IF Missile(miss%).y1% <= Monster(cnt%).y + 10 THENπ Monster(cnt%).dying = 1π END IFπ END IFπ END IFπ END IFπ WENDπ GOSUB KillMissileπ ELSEIF POINT(Missile(miss%).x2%, Missile(miss%).y2%) >= 100 THENπ cnt% = 0 ' Hit a monster! (back end)π WHILE cnt% < NumMonsters AND Monster(cnt%).dying = 0π cnt% = cnt% + 1 ' Find hit monsterπ IF Missile(miss%).x2% >= Monster(cnt%).x THENπ IF Missile(miss%).y2% >= Monster(cnt%).y THENπ IF Missile(miss%).x2% <= Monster(cnt%).x + 10 THENπ IF Missile(miss%).y2% <= Monster(cnt%).y + 10 THENπ Monster(cnt%).dying = 1π END IFπ END IFπ END IFπ END IFπ WENDπ GOSUB KillMissileπ ELSE ' Draw Missileπ LINE (Missile(miss%).x1%, Missile(miss%).y1%)-(Missile(miss%).x2%, Missile(miss%).y2%), 14π END IFπ END IFπWENDπRETURNππFire:πIF TIMER > LastMissile! + .7 OR NumMissiles = 0 THENπ ' If time has passed or there are no active missilesπ IF NumMissiles < 10 THEN ' If enough missiles leftπ NumMissiles = NumMissiles + 1π Missile(NumMissiles).radius = 78 ' Put near shipπ Missile(NumMissiles).angle = posit% ' Missile Angle = Ship Angleπ score = score - 5π IF score < 0 THEN score = 0π LastMissile! = TIMERπ END IFπEND IFπRETURNππCreateMonster:πNumMonsters = NumMonsters + 1 ' Another monsterπMonster(NumMonsters).x = 154 ' First coordinatesπMonster(NumMonsters).y = 94πMonster(NumMonsters).degree = INT(RND * 361)πMonster(NumMonsters).radius = 0 ' In the middleπMonster(NumMonsters).exist = TRUEπIF RND > .95 THEN ' Good guy 5% of timeπ Monster(NumMonsters).MonstType = 2πELSE ' Bad guy 95% of timeπ Monster(NumMonsters).MonstType = 1πEND IFπPUT (Monster(NumMonsters).x, Monster(NumMonsters).y), MonstGraph(1, Monster(NumMonsters).MonstType), PSETπRETURNππKillMonster:πIF Monster(m%).MonstType = 1 THENπ ' Further in, higher scoreπ score = score + (100 - Monster(m%).radius)π MonstersKilled% = MonstersKilled% + 1π IF MonstersKilled% MOD 15 = 0 THENπ MonstChance = MonstChance - .005π END IFπ IF MonstersKilled% MOD 20 = 0 THENπ MonstSpeed = MonstSpeed + .05π END IFπELSEπ score = score - 100π IF score < 0 THEN score = 0πEND IFπFOR cnt1% = m% TO NumMonsters ' Copy next over currentπ Monster(cnt1%).x = Monster(cnt1% + 1).xπ Monster(cnt1%).y = Monster(cnt1% + 1).yπ Monster(cnt1%).degree = Monster(cnt1% + 1).degreeπ Monster(cnt1%).radius = Monster(cnt1% + 1).radiusπ Monster(cnt1%).dying = Monster(cnt1% + 1).dyingπ Monster(cnt1%).exist = Monster(cnt1% + 1).existπ Monster(cnt1%).MonstType = Monster(cnt1% + 1).MonstTypeπNEXT cnt1%πNumMonsters = NumMonsters - 1 ' One less monster!πRETURNππKillMissile:πFOR cnt1% = miss% TO NumMissiles ' Copy next over currentπ Missile(cnt1%).x1 = Missile(cnt1% + 1).x1π Missile(cnt1%).y1 = Missile(cnt1% + 1).y1π Missile(cnt1%).x2 = Missile(cnt1% + 1).x2π Missile(cnt1%).y2 = Missile(cnt1% + 1).y2π Missile(cnt1%).angle = Missile(cnt1% + 1).angleπ Missile(cnt1%).radius = Missile(cnt1% + 1).radiusπNEXT cnt1%πNumMissiles = NumMissiles - 1 ' One less missileπRETURNππDoScore:πIF NOT beginning THENπ LOCATE 25, 1: PRINT score;π LOCATE 25, 36: PRINT MonstersKilled%;πEND IFπRETURNππDoInput:πkp% = INP(&H60) ' Get keypress in kp%πIF kp% < 100 THEN ' &H60 is > 100 if no keypressesπ IF kp% = 75 THEN ' [RIGHT]π moving = 1π ELSEIF kp% = 77 THEN ' [LEFT]π moving = -1π ELSEIF kp% = 57 THEN ' [SPACE]π GOSUB Fireπ ELSEIF kp% = 25 THEN ' [P]π GOSUB Pauseπ ELSEIF kp% = 28 THEN ' [ENTER]π GoingUp = FALSEπ Staying = 0π ScoreColor% = 1π ELSEIF kp% = 1 THEN ' [ESC]π quit = 1π END IFπEND IFπRETURNππPause:πIF NOT beginning THENπ LOCATE 5, 18: PRINT "PAUSED";π DO: LOOP UNTIL INKEY$ <> "" ' Wait for keypressπ LOCATE 5, 18: PRINT " ";πEND IFπRETURNππInit:πSCREEN 13πRANDOMIZE TIMERππCIRCLE (5, 5), 5, 100: PAINT (5, 5), 100 ' Draw monsterπLINE (0, 0)-(10, 10), 100πLINE (10, 0)-(0, 10), 100πLINE (4, 5)-(6, 5), 101πLINE (5, 4)-(5, 6), 101πPSET (0, 0), 101: PSET (10, 0), 101πPSET (0, 10), 101: PSET (10, 10), 101πGET (0, 0)-(10, 10), MonstGraph(1, 1)πPUT (0, 0), MonstGraph(1, 1)ππPUT (10, 10), MonstGraph(1, 1)πLINE (10, 15)-(20, 15), 0 ' Explosion 1πLINE (15, 10)-(16, 20), 0πLINE (14, 14)-(17, 16), 0, BπCIRCLE (15, 15), 3, 12, , , 1 / 3πPAINT (15, 15), 12πPSET (14, 13), 7πPSET (17, 17), 7πGET (8, 8)-(22, 22), ExplodeGraph(1, 1)ππCIRCLE (16, 15), 4, 0 ' Explosion 2πCIRCLE (15, 15), 4, 12, , , 1 / 2πCIRCLE (15, 15), 2, 14, , , 1 / 2πPAINT (15, 15), 14πCIRCLE (13, 12), 1, 7: PSET (13, 12), 7πCIRCLE (18, 18), 1, 7: PSET (18, 18), 7πGET (8, 8)-(22, 22), ExplodeGraph(1, 2)ππPUT (10, 10), MonstGraph(1, 1), PSET ' Explosion 3πCIRCLE (15, 15), 6, 0: PAINT (15, 15), 0πCIRCLE (15, 15), 6, 4, , , 1 / 2πPAINT (15, 15), 4πCIRCLE (15, 15), 4, 14, , , 1 / 2πPAINT (15, 15), 14πPSET (10, 10), 0πCIRCLE (12, 11), 1, 8πCIRCLE (19, 19), 1, 8πGET (8, 8)-(22, 22), ExplodeGraph(1, 3)πPUT (8, 8), ExplodeGraph(1, 3)ππCIRCLE (15, 15), 7, 116, , , 1 / 2 ' Explosion 4πPAINT (15, 15), 116πCIRCLE (15, 15), 4, 0, , , 1 / 2πPAINT (15, 15), 0πGET (8, 8)-(22, 22), ExplodeGraph(1, 4)πPUT (8, 8), ExplodeGraph(1, 4)ππCIRCLE (15, 15), 7, 43, , , 1 / 2 ' Explosion 5πGET (8, 8)-(22, 22), ExplodeGraph(1, 5)πPUT (8, 8), ExplodeGraph(1, 5)ππCIRCLE (15, 15), 5, 104, , , 1 / 3 ' Draw good guyπPAINT (15, 15), 104πCIRCLE (15, 15), 5, 104, , , 3πLINE (15, 10)-(15, 20), 104πLINE (10, 10)-(20, 20), 104πLINE (20, 10)-(10, 20), 104πGET (10, 10)-(20, 20), MonstGraph(1, 2)πPUT (10, 10), MonstGraph(1, 2)ππPALETTE 100, 30 ' Change monster color to redπPALETTE 104, 3942440 ' Change good guy color to bright blueππFOR cnt% = 0 TO 360 ' Initialise look-up tablesπ SinLook(cnt%) = SIN(cnt% * DEG2RAD)π CosLook(cnt%) = COS(cnt% * DEG2RAD)πNEXT cnt%ππposit% = 0 ' Player's initial position = 0πship.lxo = INT(80 * CosLook(posit%)) + 159πship.lyo = INT(80 * SinLook(posit%)) + 99πscore = 0πMonstersKilled% = 0πScoreColor% = 0πScoreMoving% = 1ππFOR cnt% = 1 TO TOT.STARS ' Initialise starsπ star(cnt%).radius = INT(RND * 100)π star(cnt%).degree = INT(RND * 361)π IF RND > .9 THEN ' Specialπ star(cnt%).special = TRUEπ star(cnt%).length = INT(RND * 10 + 15)π star(cnt%).colr = 9π star(cnt%).speed = 15π ELSE ' Normalπ star(cnt%).length = 1π star(cnt%).colr = INT(RND * 15 + 16)π star(cnt%).speed = ((star(cnt%).colr - 15) / 5) + 1π END IFπNEXT cnt%ππship.BorderColor = 53 ' Original ship color is light blueπship.filled = FALSE ' Ship is not filledπship.NumVertices = 11 ' 11 verticesπFOR cnt% = 1 TO ship.NumVertices ' Define verticesπ READ ShipVert(cnt%).x, ShipVert(cnt%).yπNEXT cnt%ππMonstSpeed = .1πMonstChance = .97ππPALETTE 102, 0πCOLOR 102ππbeginning = TRUEπGoingUp = TRUEππDrawPolygon ship, ShipVert()ππRETURNππEndOfGame:πIF quit = 1 THENπ SCREEN 0: WIDTH 80π PRINT "Quitter!"πELSEIF quit = 2 THENπ LOCATE 12, 16: PRINT "YOU LOSE";π SLEEP 2 ' Pause for two secondsπ done = FALSEπ cnt% = 0π WHILE cnt% < 2000 AND NOT doneπ cnt% = cnt% + 1 ' Loop 3000 timesπ XX% = INT(RND * 271)π YX% = INT(RND * 150)π GET (XX%, YX%)-(XX% + 48, YX% + 48), meltπ PUT (XX%, YX% + 1), melt, PSETπ ' End on keyhit only after melting awhileπ IF INKEY$ <> "" THEN IF cnt% > 500 THEN done = TRUEπ ' Do an occasional delayπ IF cnt% MOD 100 = 0 THEN t! = TIMER: WHILE t! = TIMER: WENDπ WENDπ SCREEN 0: WIDTH 80 ' Normal text screenπEND IFπRETURNππDATA 0, 0πDATA 5, -5πDATA 10, -5πDATA 5, -10πDATA 10, -10πDATA 15, -5πDATA 15, 5πDATA 10, 10πDATA 5, 10πDATA 10, 5πDATA 5, 5ππSUB DrawPolygon (poly AS PolygonType, verts() AS VertexType)ππxo = poly.lxoπyo = poly.lyoππIF poly.filled THENπ FOR index = 1 TO poly.NumVertices - 1π LINE (xo + verts(index).x, yo + verts(index).y)-(xo + verts(index + 1).x, yo + verts(index + 1).y), poly.FilledColorπ NEXT indexπ LINE (xo + verts(poly.NumVertices).x, yo + verts(poly.NumVertices).y)-(xo + verts(1).x, yo + verts(1).y), poly.FilledColorπ PAINT (xo, yo), poly.FilledColorπELSEπ FOR index = 1 TO poly.NumVertices - 1π LINE (xo + verts(index).x, yo + verts(index).y)-(xo + verts(index + 1).x, yo + verts(index + 1).y), poly.BorderColorπ NEXT indexπ LINE (xo + verts(poly.NumVertices).x, yo + verts(poly.NumVertices).y)-(xo + verts(1).x, yo + verts(1).y), poly.BorderColorπEND IFππEND SUBππSUB ErasePolygon (poly AS PolygonType, verts() AS VertexType)ππxo = poly.lxoπyo = poly.lyoππIF poly.filled THENπ FOR index = 1 TO poly.NumVertices - 1π LINE (xo + verts(index).x, yo + verts(index).y)-(xo + verts(index + 1).x, yo + verts(index + 1).y), 0π NEXT indexπ LINE (xo + verts(poly.NumVertices).x, yo + verts(poly.NumVertices).y)-(xo + verts(1).x, yo + verts(1).y), 0π PAINT (xo, yo), FilledColorπELSEπ FOR index = 1 TO poly.NumVertices - 1π LINE (xo + verts(index).x, yo + verts(index).y)-(xo + verts(index + 1).x, yo + verts(index + 1).y), 0π NEXT indexπ LINE (xo + verts(poly.NumVertices).x, yo + verts(poly.NumVertices).y)-(xo + verts(1).x, yo + verts(1).y), 0πEND IFππEND SUBππSUB RotatePolygon (poly AS PolygonType, verts() AS VertexType, angle AS INTEGER)ππIF angle >= 0 THENπ si = SIN(angle * DEG2RAD)π cs = COS(angle * DEG2RAD)πELSEπ si = SIN((angle + 360) * DEG2RAD)π cs = COS((angle + 360) * DEG2RAD)πEND IFππFOR index = 1 TO poly.NumVerticesπ rx = verts(index).x * cs - verts(index).y * siπ ry = verts(index).y * cs + verts(index).x * siπ verts(index).x = rxπ verts(index).y = ryπNEXT indexππEND SUBπThe ABC Programmer JEWEL - LIKE COLUMNS Converted from Pascal code 10-20-96 (18:11) QB, QBasic, PDS 498 14257 JEWEL.BAS '********************************************************π'* WARNING: CODE BELOW CONTAINS VERY ADDICTIVE GAME PLAYπ'********************************************************π'* JEWEL (ASCII Version) - Like Columns for Sega(tm)π'* 100% Public Domain - all rights relinquishedπ'* Colour/Monochrome compatible!π'*π'* This version has been 95% ported from Turbo Pascalπ'* code to BASIC by William Yu (10-20-96)π'* Minor alterations/optimization routines have beenπ'* implemented. Game has been ported AS IS.π'* Not responsible for misinterpreted translation.π'*π'* Original code for XWindows - Author Unknownπ'* Original code for TP - Jurgen Prins (???)π'*π'* Turbo Pascal code can be found at (as of 10/96):π'* http://www.cs.vu.nl/~jprins/ftp/src/jewel.zipπ'*π'* Instructions for gameplay (as written):π'*π'* Try to get three same colors in an horizontal,π'* vertical or diagonal row. Switch colors with Up,π'* move with Left & Right, force placementπ'* with Down. P is pause, Esc is quit.π'*π'* Notice: (as discovered)π'*π'* The "clear all" jewel will clear all jews ofπ'* ONE colour. So if the "clear all" jewel landsπ'* on the colour red, it would clear all red jewels.π'* π'********************************************************πDEFINT A-ZπDECLARE FUNCTION RandomColor% ()πDECLARE SUB InitField ()πDECLARE SUB InitVars ()πDECLARE SUB InitScreen ()πDECLARE SUB RefreshScreen ()πDECLARE FUNCTION GenerateNewBlock% ()πDECLARE FUNCTION MoveBlockDown% (col%, startRow%, endRow%, checkflag%)πDECLARE SUB SwapBlockColors ()πDECLARE SUB ForceBlockDown ()πDECLARE SUB MoveBlockLeft ()πDECLARE SUB MoveBlockRight ()πDECLARE SUB GetKeyboardEvent ()πDECLARE FUNCTION MatchesFound% ()πDECLARE SUB WriteLives ()πDECLARE SUB WriteScore ()ππSCREEN 0, 0, 0, 0ππCONST JewelChr = ""πCONST JewelChance = 20 ' Chance of receiving the "clear all" jewelπCONST MatchBackGround = 0πCONST MatchForeGround = 31πCONST False = 0πCONST True = NOT FalseπCONST Mono = False ' <--- Playable even with monochrome display!π ' Change to TRUE if you don't have color.πCONST BigScreen = True ' For WIDTH 40, 25 or for graphics modeππDIM SHARED Well(0 TO 31, 0 TO 22) AS INTEGERππDIM SHARED Colors, Rows, Cols, LeftX, RightX, TopY, BotYπDIM SHARED BlockCol, BlockEndRow, SpeedDelay!, Lives, LevelπDIM SHARED IncreaseSpeed!, ScoreObtainedπDIM SHARED AchievedScore AS LONGπDIM SHARED Score AS LONGπDIM SHARED Pause, Escapeππ'********************************π' Initialize variablesπ'********************************ππ IF BigScreen THEN WIDTH 40, 25ππ SpeedDelay! = .5 ' Delay in secondsπ IncreaseSpeed! = .025 ' Increase speed for each ScoreObtainedπ ScoreObtained = 2500 ' Speed increases with every 2500 points obtainedπ AchievedScore = ScoreObtainedππ Level = 100 ' Levels have not been implemented, this affects scoreπ Cols = 6 ' Max of 30 depending on WIDTHπ Rows = 20 ' Max of 22π Colors = 5 ' Number of color gems used, Max of 10π Score = 0 ' Starting scoreπ Lives = 3 ' How many lives remainingππ'*********************************ππ InitScreenπ WHILE (Lives > 0)π InitFieldπ WriteLivesπ RefreshScreenπ WHILE (GenerateNewBlock) AND (NOT Escape)π RefreshScreenπ WHILE MoveBlockDown(BlockCol, BlockEndRow - 2, BlockEndRow, True) AND (NOT Escape)π BlockEndRow = BlockEndRow + 1π RefreshScreenπ T! = TIMERπ DOπ GetKeyboardEventπ LOOP UNTIL TIMER - T! >= SpeedDelay! AND (NOT Pause)π WENDπ DOπ LOOP UNTIL NOT MatchesFoundπ WENDπ Lives = Lives - 1π SpeedDelay! = .5π WENDπ WriteScoreππENDππSUB ForceBlockDownππ WHILE MoveBlockDown(BlockCol, BlockEndRow - 2, BlockEndRow, True)π BlockEndRow = BlockEndRow + 1π WENDππEND SUBππFUNCTION GenerateNewBlockππ RANDOMIZE TIMERπ midCol = (Cols / 2) + 1π IF Well(midCol, 3) <> 0 THENπ GenerateNewBlock = Falseπ ELSEπ IF INT(RND * JewelChance) = 0 THENπ FOR I = 1 TO 3π Well(midCol, I) = 24π NEXT Iπ ELSEπ FOR I = 1 TO 3π Well(midCol, I) = RandomColorπ NEXT Iπ END IFπ GenerateNewBlock = Trueπ END IFπ BlockCol = midColπ BlockEndRow = 3ππEND FUNCTIONππSUB GetKeyboardEventππ Ch$ = INKEY$π IF LEN(Ch$) THENπ IF LEN(Ch$) = 2 THEN Ch = -(ASC(RIGHT$(Ch$, 1))) ELSE Ch = ASC(UCASE$(Ch$))π SELECT CASE Chπ CASE -72π SwapBlockColorsπ RefreshScreenπ CASE -80π ForceBlockDownπ RefreshScreenπ CASE -75π MoveBlockLeftπ RefreshScreenπ CASE -77π MoveBlockRightπ RefreshScreenπ CASE 27π Escape = Trueπ CASE 80π Pause = NOT Pauseπ END SELECTπ END IFππEND SUBππSUB InitFieldππ FOR row = 1 TO Rowsπ FOR col = 1 TO Colsπ Well(col, row) = 0π NEXT colπ NEXT rowππEND SUBππSUB InitScreenππ COLOR 6π IF BigScreen THEN MidPoint = 20 ELSE MidPoint = 40ππ TopY = ((25 - Rows) / 2)π BotY = TopY + Rows - 1π LeftX = MidPoint - Colsπ RightX = MidPoint - 1 + Colsππ LOCATE TopY - 1, LeftXπ PRINT STRING$(Cols * 2 + 1, CHR$(196));ππ LOCATE BotY + 1, LeftXπ PRINT STRING$(Cols * 2 + 1, CHR$(196));π π FOR y = TopY - 1 TO BotY + 1π LOCATE y, LeftX - 1π PRINT CHR$(179);π LOCATE y, RightX + 1π PRINT CHR$(179);π NEXT yπ LOCATE TopY - 1, MidPoint - 1 - Colsπ PRINT CHR$(218);π LOCATE TopY - 1, MidPoint + Colsπ PRINT CHR$(191);π LOCATE BotY + 1, MidPoint - 1 - Colsπ PRINT CHR$(192);π LOCATE BotY + 1, MidPoint + Colsπ PRINT CHR$(217);ππEND SUBππSUB InitVarsππ' Moved to main programππEND SUBππFUNCTION MatchesFoundππDIM MatchField(0 TO 31, 0 TO 22) AS INTEGERππ Found = Falseππ '(* initialize the Matchfield *)π FOR J = 1 TO Rowsπ FOR I = 1 TO Colsπ MatchField(I, J) = MatchBackGroundπ NEXT Iπ NEXT Jππ IF Well(BlockCol, BlockEndRow) = 24 THEN '(* we have a jewel here! *)π IF BlockEndRow < Rows THENπ Colour = Well(BlockCol, BlockEndRow + 1)π FOR J = 1 TO Rowsπ FOR I = 1 TO Colsπ IF (Well(I, J) = Colour) OR (Well(I, J) = 24) THEN MatchField(I, J) = MatchForeGroundπ NEXT Iπ NEXT Jπ ELSEπ FOR BlockRow = BlockEndRow TO BlockEndRow - 2 STEP -1π MatchField(BlockCol, BlockRow) = MatchForeGroundπ NEXT BlockRowπ END IFπ Found = Trueπ ELSEπ FOR BlockRow = BlockEndRow TO BlockEndRow - 2 STEP -1π Colour = Well(BlockCol, BlockRow)ππ '(* Look for vertical matches, first downwards, then upwards *)π J = BlockRow + 1π WHILE ((J <= Rows) AND (Well(BlockCol, J) = Colour))π J = J + 1π WENDπ J = J - 1π Endmatch = Jπ WHILE ((J >= 1) AND (Well(BlockCol, J) = Colour))π J = J - 1π WENDπ Startmatch = J + 1π IF (Endmatch - Startmatch > 1) AND (Colour <> 0) THENπ FOR J = Startmatch TO Endmatchπ MatchField(BlockCol, J) = MatchForeGroundπ NEXT Jπ Found = Trueπ END IFππ '(* Look for horizontal matches, first rightwards, then to the left*)π I = BlockCol + 1π WHILE ((I <= Cols) AND (Well(I, BlockRow) = Colour))π I = I + 1π WENDπ I = I - 1π Endmatch = Iπ WHILE ((I >= 1) AND (Well(I, BlockRow) = Colour))π I = I - 1π WENDπ Startmatch = I + 1π IF (Endmatch - Startmatch > 1) AND (Colour <> 0) THENπ FOR I = Startmatch TO Endmatchπ MatchField(I, BlockRow) = MatchForeGroundπ NEXT Iπ Found = Trueπ END IFππ '(* look for diagonal matches, first rightdownwards, then leftup *)π J = BlockRow + 1π I = BlockCol + 1π WHILE ((J <= Rows) AND (I <= Cols) AND (Well(I, J) = Colour))π I = I + 1π J = J + 1π WENDπ I = I - 1π J = J - 1π Endmatch = Iπ WHILE ((J >= 1) AND (I >= 1) AND (Well(I, J) = Colour))π I = I - 1π J = J - 1π WENDπ Startmatch = I + 1π IF (Endmatch - Startmatch > 1) AND (Colour <> 0) THENπ FOR I = Startmatch TO Endmatchπ MatchField(I, I - (BlockCol - BlockRow)) = MatchForeGroundπ NEXT Iπ Found = Trueπ END IFππ '(* look for diagonal matches, first leftdownwards, then rightup *)π J = BlockRow + 1π I = BlockCol - 1π WHILE ((J <= Rows) AND (I >= 1) AND (Well(I, J) = Colour))π I = I - 1π J = J + 1π WENDπ I = I + 1π J = J - 1π Endmatch = Iπ WHILE ((J >= 1) AND (I <= Cols) AND (Well(I, J) = Colour))π I = I + 1π J = J - 1π WENDπ Startmatch = I - 1π IF (Startmatch - Endmatch > 1) AND (Colour <> 0) THENπ FOR I = Startmatch TO Endmatch STEP -1π MatchField(I, (BlockCol + BlockRow) - I) = MatchForeGroundπ NEXT Iπ Found = Trueπ END IFπ NEXT BlockRowππ END IFππ '(* handle the first row (there are no blocks above to move down) *)π FOR I = 1 TO Colsπ IF MatchField(I, 1) = MatchForeGround THEN Well(I, 1) = 0π NEXT Iππ '(* scan Matchfield and move at each encounter upper blocks down *)π FOR J = 2 TO Rowsπ FOR I = 1 TO Colsπ IF MatchField(I, J) = MatchForeGround THENπ MV = MoveBlockDown(I, 1, J - 1, False)π 'ForceBlockDownπ IF (I = BlockCol) AND (BlockEndRow < Rows) THEN BlockEndRow = BlockEndRow + 1π RefreshScreenπ Score = Score + (10000 / Level)π IF (Score > AchievedScore) THENπ AchievedScore = AchievedScore + ScoreObtainedπ IF (SpeedDelay! > .1) THEN SpeedDelay! = SpeedDelay! - IncreaseSpeed!π END IFπ END IFπ NEXT Iπ NEXT Jππ MatchesFound = FoundππEND FUNCTIONππFUNCTION MoveBlockDown (col, startRow, endRow, checkflag)π π IF endRow = Rows THENπ MoveBlockDown = Falseπ ELSEπ IF checkflag AND (Well(col, endRow + 1) <> 0) THENπ MoveBlockDown = Falseπ ELSEπ FOR I = endRow + 1 TO startRow + 1 STEP -1π Well(col, I) = Well(col, I - 1)π NEXT Iπ Well(col, startRow) = 0π MoveBlockDown = Trueπ END IFπ END IFππEND FUNCTIONππSUB MoveBlockLeftππ IF BlockCol > 1 THENπ IF (Well(BlockCol - 1, BlockEndRow) = 0) AND (Well(BlockCol - 1, BlockEndRow - 1) = 0) AND (Well(BlockCol - 1, BlockEndRow - 2) = 0) THENπ BlockCol = BlockCol - 1π FOR I = BlockEndRow - 2 TO BlockEndRowπ Well(BlockCol, I) = Well(BlockCol + 1, I)π Well(BlockCol + 1, I) = 0π NEXT Iπ END IFπ END IFππEND SUBππSUB MoveBlockRightππ IF BlockCol < Cols THENπ IF (Well(BlockCol + 1, BlockEndRow) = 0) AND (Well(BlockCol + 1, BlockEndRow - 1) = 0) AND (Well(BlockCol + 1, BlockEndRow - 2) = 0) THENπ BlockCol = BlockCol + 1π FOR I = BlockEndRow - 2 TO BlockEndRowπ Well(BlockCol, I) = Well(BlockCol - 1, I)π Well(BlockCol - 1, I) = 0π NEXT Iπ END IFπ END IFππEND SUBππFUNCTION RandomColorππ RANDOMIZE TIMERπ SELECT CASE INT(RND * Colors)π CASE 0π RandomColor = 1π CASE 1π RandomColor = 2π CASE 2π RandomColor = 4π CASE 3π RandomColor = 7π CASE 4π RandomColor = 14π CASE 5π RandomColor = 11π CASE 6π RandomColor = 13π CASE 7π RandomColor = 9π CASE 8π RandomColor = 12π CASE 9π RandomColor = 15π END SELECTππEND FUNCTIONππSUB RefreshScreenππ row = 1π col = 1π x = LeftXπ y = TopYπ WHILE (y <= BotY)π WHILE (x < RightX)π LOCATE y, xπ IF NOT Mono THENπ COLOR Well(col, row)π PRINT JewelChr;π ELSEπ IF Well(col, row) = 0 THENπ PRINT " "π ELSEπ PRINT CHR$(Well(col, row) + 64);π END IFπ END IFπ x = x + 2π col = col + 1π WENDπ y = y + 1π row = row + 1π x = LeftXπ col = 1π WENDπ COLOR 5π LOCATE TopY - 1, LeftX + 1π PRINT Score;ππEND SUBππSUB SwapBlockColorsππ I = Well(BlockCol, BlockEndRow - 2)π Well(BlockCol, BlockEndRow - 2) = Well(BlockCol, BlockEndRow - 1)π Well(BlockCol, BlockEndRow - 1) = Well(BlockCol, BlockEndRow)π Well(BlockCol, BlockEndRow) = IππEND SUBππSUB WriteLivesππ COLOR 5π LOCATE TopY - 1, RightX - 1π PRINT Lives;ππEND SUBππSUB WriteScoreππ WIDTH 80π COLOR 7π PRINT "Jewel for DOS - Converted from Pascal code to BASIC by William Yu (10/96)"π COLOR 2π PRINT "Total score : "; Scoreπ COLOR 7π PRINTππEND SUBπLuke Molnar GORAU SHADED POLYGONS Blood225@aol.com 09-01-96 (14:51) QB, QBasic, PDS 261 5879 GORAU.BAS π' Gorau Shaded Polygons. Written by Luke Molnar. A Molnar \ Kucalabaπ' Productions program. Tons of concept and execution help provided byπ' David Eichorn. If you are one of those people that need really obviousπ' things pointed out, this is REALLY SLOW! I don't think many people inπ' their right mind would try to write a Gorau routine in QBasic and demandπ' that it be fast enough for animation, but this is pretty nice lookingπ' if I do say so myself. :-)πππ' Another QBasic graphics "demo" that appeared first at :ππ' WWW : http://members.aol.com/mkwebsite/index.htmlπ' FTP : ftp://users.aol.com/blood225/ππππDECLARE SUB GorauFill (Points() AS ANY)πDECLARE SUB Delay (Seconds!)πDECLARE SUB ChangeColors ()πDECLARE FUNCTION ValidPolPoints! ()πππ'$DYNAMICπRANDOMIZE TIMERππCLSπSCREEN 13πππTYPE GorTypeπ Y1 AS INTEGERπ Y2 AS INTEGERπ C1 AS INTEGERπ C2 AS INTEGERπEND TYPEππTYPE RoutineTypeπ X AS INTEGERπ Y AS INTEGERπ C AS INTEGERπEND TYPEππππDIM SHARED PolPoints(0 TO 3) AS RoutineTypeπππCOLOR 230ππDOπ π ThisShouldBeASub% = ValidPolPoints ' Generate decent polygon pointsππ ChangeColors ' Randomly assign a color schemeππ GorauFill PolPoints() ' Fill the 4 point polygonπ π Delay 1 ' Give user time to admire the beauty ππ User$ = INKEY$ ' Store any keypresses ππ CLS ' Clear the screenππLOOP UNTIL User$ <> "" ' Keep going until they press a keyππCLSπSCREEN 0πWIDTH 80πSYSTEMππREM $STATICπSUB ChangeColorsππ' Changes the palette to one of 6 possible color variationsππDifColors% = INT(RND * 6) + 1ππFOR X% = 1 TO 230ππ OUT &H3C8, X%ππ SELECT CASE DifColors%π CASE 1: OUT &H3C9, EasyVal!: OUT &H3C9, 0: OUT &H3C9, 0π CASE 2: OUT &H3C9, 0: OUT &H3C9, EasyVal!: OUT &H3C9, 0π CASE 3: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, EasyVal!π CASE 4: OUT &H3C9, EasyVal!: OUT &H3C9, EasyVal!: OUT &H3C9, EasyVal!π CASE 5: OUT &H3C9, EasyVal!: OUT &H3C9, EasyVal!: OUT &H3C9, 0π CASE 6: OUT &H3C9, EasyVal!: OUT &H3C9, 0: OUT &H3C9, EasyVal!π END SELECTππ EasyVal! = EasyVal! + .273913ππNEXTππEND SUBππSUB Delay (Seconds!)πFuture! = TIMER + Seconds!πDOπLOOP UNTIL TIMER >= Future! OR TIMER - (TIMER - Seconds!) < 0πEND SUBππSUB GorauFill (Points() AS RoutineType)ππDIM Scan(0 TO 320) AS GorTypeππXMax% = -32767πXmin% = 32767ππFOR X% = 0 TO 3π IF XMax% < Points(X%).X THEN XMax% = Points(X%).Xπ IF Xmin% > Points(X%).X THEN Xmin% = Points(X%).Xπ PSET (Points(X%).X, Points(X%).Y), 230πNEXTπππ IF Xmin% < 0 THEN Xmin% = 0π IF XMax% > 320 THEN XMax% = 320π IF Xmin% > 320 THEN EXIT SUBπ IF XMax% < 0 THEN EXIT SUBππFOR X% = Xmin% TO XMax%π Scan(X%).Y1 = -32767πNEXTππππFOR X% = 0 TO 3ππ Val1% = X%π Val2% = (X% + 1) MOD 4ππ IF Points(Val1%).X > Points(Val2%).X THENπ SWAP Val1%, Val2%π END IFπ π Y1% = Points(Val1%).Yπ x1% = Points(Val1%).Xπ Col1% = Points(Val1%).Cππ Y2% = Points(Val2%).Yπ x2% = Points(Val2%).Xπ Col2% = Points(Val2%).Cππ YDelta% = Y2% - Y1%π π XDelta% = x2% - x1%π CDelta% = Col2% - Col1%π π IF XDelta% <> 0 THENπ YSlope! = YDelta% / XDelta%π CSlope! = CDelta% / XDelta%π ELSEπ YSlope% = 0π CSlope% = 0π END IFππ YVal! = Y1%π CVal! = Col1%π π FOR I% = x1% TO x2%π π IF Scan(I%).Y1 = -32767 THENπ Scan(I%).Y1 = YVal!π Scan(I%).C1 = CVal!π ELSEπ Scan(I%).Y2 = YVal!π Scan(I%).C2 = CVal!π END IFππ YVal! = YVal! + YSlope!π CVal! = CVal! + CSlope!π π NEXTππNEXTππππFOR X% = Xmin% TO XMax%ππ IF Scan(X%).Y1 > Scan(X%).Y2 THENπ Y2% = Scan(X%).Y1π Y1% = Scan(X%).Y2π Col2% = Scan(X%).C1π Col1% = Scan(X%).C2π ELSEπ Y2% = Scan(X%).Y2π Y1% = Scan(X%).Y1π Col2% = Scan(X%).C2π Col1% = Scan(X%).C1π END IFππ YDelta% = Y2% - Y1%π π IF YDelta% = 0 THEN YDelta% = 1ππ CDelta% = Col2% - Col1%π CSlope! = CDelta% / YDelta%π CVal! = Col1%ππ FOR I% = Scan(X%).Y1 TO Scan(X%).Y2π PSET (X%, I%), CVal!π CVal! = CVal! + CSlope!π NEXTππNEXTππππEND SUBππFUNCTION ValidPolPointsππ' There are certain occurences with this routine in which the polygon willπ' not be correctly filled in. This routine prevents those polygons fromπ' happening.ππFOR I% = 0 TO 3π π SELECT CASE I%π CASE 0:π PolPoints(0).X = INT(RND * 60) + 1π PolPoints(0).Y = INT(RND * 60) + 1π CASE 1:π PolPoints(1).X = INT(RND * 160) + 160π PolPoints(1).Y = INT(RND * 100) + 2π' IF PolPoints(1).Y < PolPoints(0).Y THEN PolPoints(1).Y = PolPoints(0).Y + INT(RND * (100 - PolPoints(0).Y))π CASE 2:π PolPoints(2).X = INT(RND * 160) + 160π' IF PolPoints(2).X < PolPoints(1).X THEN PolPoints(2).X = PolPoints(1).X + 1π PolPoints(2).Y = INT(RND * 50) + 150π CASE 3:π PolPoints(3).X = INT(RND * 160) + 1π IF PolPoints(3).X < PolPoints(0).X THEN PolPoints(3).X = PolPoints(0).X + INT(RND * (160 - PolPoints(0).X))π PolPoints(3).Y = INT(RND * 100) + 100π' IF PolPoints(3).Y < PolPoints(2).Y THEN PolPoints(3).Y = PolPoints(2).Y + INT(RND * (100 - PolPoints(2).Y))π END SELECTππ PolPoints(I%).C = -1ππNEXTππ π' Make one corner black and one corner the brightest color; the other 2 randomπ π DO UNTIL BlackOne% <> BrightOne%π BlackOne% = INT(RND * 3)π BrightOne% = INT(RND * 3)π LOOPππ PolPoints(BlackOne%).C = 0π PolPoints(BrightOne%).C = 230ππ FOR I% = 0 TO 3π IF PolPoints(I%).C = -1 THEN PolPoints(I%).C = INT(RND * 230) + 1π NEXTππEND FUNCTIONππJonathan Leger FAST 320X200X256 PCX VIEWER leger@mail.dtx.net 09-02-96 (10:10) QB, QBasic, PDS 152 5773 PCX.BAS '***** PCX.BAS *****************************************************π'*** The original code for this routine was found in VGAPCX.BAS ***π'*** At first I optomized the code in that file, and eventually ***π'*** I ended up re-writing the whole thing. That PCX loader did ***π'*** a number of things differently, including loading the color ***π'*** palette _last_. This routine loads the palette first, so ***π'*** you can see the "correct" picture as the PCX is loading. In ***π'*** addition to that, I use all integers for speed and load the ***π'*** file in chunks of 2,000 bytes (instead of 1 byte at a time, ***π'*** as in the other routine, VGAPCX.BAS). I thank the uknown ***π'*** author of that original version, VGAPCX.BAS, because if he ***π'*** had not put out that sample code, this PCX loader would not ***π'*** be possible. ***π'*******************************************************************π'*** On a 486dx2-66, the old version (VGAPCX.BAS) loaded the PCX ***π'*** in about 21 seconds. This new version does so in about 1.5 ***π'*** seconds. The speed varies depending on the level of file ***π'*** compression attained by the PCX file. ***π'*******************************************************************πDEFINT A-ZππDECLARE SUB ShowPCX (file$)ππ'*** If you're using Qbasic 1.1, change this line toπ'*** ShowPCX "<pcxfile>.pcx"πShowPCX COMMAND$ππWHILE INKEY$ = "": WENDπSCREEN 0: WIDTH 80ππ'*** Loads a Version 5, 320x200x256c PCX file.π'*** If you have any questions or comments about any of this code,π'*** please contact me, Jonathan Leger, at leger@mail.dtx.net.πSUB ShowPCX (file$)ππSCREEN 13ππDIM pcxpal AS STRING * 768, pcxversion AS STRING * 1ππpcxnum = FREEFILEπOPEN file$ FOR BINARY AS #pcxnumππ '*** Get the PCX version from the header.π GET #pcxnum, 2, pcxversionππ '*** If we're using version 5, then load the palette.π IF ASC(pcxversion) = 5 THENπ '*** Grab the palette out of the file.π GET #1, LOF(pcxnum) - 767, pcxpalππ '*** Start with color 0.π pal = 0ππ '*** Grab the red/green/blue value from our palette (PCXPAL) andπ '*** send them to the monitor using OUT.π FOR p = 1 TO 768 STEP 3π OUT &H3C8, palπ red% = INT(ASC(MID$(pcxpal, p, 1)) / 4)π OUT &H3C9, red%π green% = INT(ASC(MID$(pcxpal, p + 1, 1)) / 4)π OUT &H3C9, green%π blue% = INT(ASC(MID$(pcxpal, p + 2, 1)) / 4)π OUT &H3C9, blue%π pal = pal + 1π NEXT pππ END IFπ π '*** Jump past the file header.π SEEK #pcxnum, 129ππ '*** We'll be sending the output the the screen, so our segmentπ '*** is &HA000 (VGA screen memory) and our offset is 0. You canπ '*** change these values to, say, decompress the image into anπ '*** array or something.π fxoffset = 0: fxsegment = &HA000ππ '*** We'll be reading chunks of 2,000 bytes. You can increase orπ '*** decrease this depending on your needs. I noticed little orπ '*** no difference when the chunk size went past 2,000, so I leftπ '*** it at 2,000 to add as little over-head as possible with maximumπ '*** speed.π datasize = 2000ππ '*** Load our first chunk of data and point to the beginning of thatπ '*** data.π pcxdata$ = INPUT$(datasize, pcxnum)π datacount = 1ππ '*** To increase speed, we'll be drawing the screen in two loops,π '*** that way we can use integers to point to the next pixel insteadπ '*** of long integers. Doing this gains tremendous speed.π FOR half = 1 TO 2ππ '*** On the second loop, this will add &H7D0 (32000) to ourπ '*** segment so we'll be writing to the second half of the screen.π '*** On the first loop, this will simply set our segment to &HA000.π fxtotal = fxsegment + fxoffsetπ DEF SEG = fxtotalππ FOR c = 0 TO 31999ππ '*** If we're out of data, then we need to load the next chunk.π IF datacount > datasize THENπ pcxdata$ = INPUT$(datasize, pcxnum)π datacount = 1π END IFππ '*** Get the next byte from our data chunk.π clr = ASC(MID$(pcxdata$, datacount, 1))π datacount = datacount + 1ππ '*** If we're out of data, then we load the next chunk.π IF datacount > datasize THENπ pcxdata$ = INPUT$(datasize, pcxnum)π datacount = 1π END IFπ π '*** If the byte we pulled from the data has bit 6 and 7 set,π '*** (which would make the value greater than 192), then thatπ '*** means we'll be repeating a color. So we pull the nextπ '*** byte from our data chunk (which is the color), and putπ '*** it on the screen CLR - 192 times (in other words, weπ '*** take the value of the first 5 bits in the byte and putπ '*** the pixel to the screen that many times.)π IF clr > 192 THENπ LPS = clr - 192π clr = ASC(MID$(pcxdata$, datacount, 1))π datacount = datacount + 1π FOR L = LPS TO 1 STEP -1π POKE c, clrπ c = c + 1π NEXT Lπ c = c - 1π ELSEπ '*** Since the byte was less than 192, then we just poke theπ '*** pixel to the screen.π POKE c, clrπ END IFπ NEXT cπ '*** We'll move to the second half of the screen by adding 32,000π '*** (HEX = 7D0) bytes to our segment value.π fxoffset = fxoffset + &H7D0π NEXT halfππ'*** All done! Close the file.πCLOSE pcxnumππ'*** Return to BASIC's default segment. Very important!πDEF SEGππEND SUBπJonathan Leger GRAPHICS LOADER UPDATE leger@mail.dtx.net 09-02-96 (10:10) QB, QBasic, PDS 981 27476 FX2.BAS DEFINT A-Zππ'**** Screen routinesπDECLARE SUB LoadGif (file$)πDECLARE SUB LoadPcx (file$)πDECLARE SUB BsaveScreen (file$)πDECLARE SUB GiftoBSAVE (gif$, bsave$, pal$)ππ'*** Palette routinesπDECLARE SUB GetPal (pal())πDECLARE SUB PutPal (pal())πDECLARE SUB SavePal (file$)πDECLARE SUB LoadPal (file$)πDECLARE SUB RotatePal (direction, pal())πDECLARE SUB CyclePal (direction, pal(), numcycles)ππ'*** Palette fxπDECLARE SUB FadeOut (pal())πDECLARE SUB FadeIn (pal())πDECLARE SUB BlackOut ()ππ'*** Drawing RoutinesπDECLARE SUB ClrScr (col)ππ'*** Font routinesπDECLARE SUB Font (Text$, XStart, Ystart, Xscale, Yscale, Style, clr)πDECLARE SUB LoadFont ()πDECLARE SUB MakeFont ()πDECLARE SUB FontPal ()ππ'*** EMS routinesπDECLARE FUNCTION NumEMSHandles% ()πDECLARE FUNCTION NumEMSPages% (Handle%)πDECLARE FUNCTION GetEMS% (numpages%)πDECLARE FUNCTION EMSPages% (func%)πDECLARE FUNCTION PageFrame% ()πDECLARE FUNCTION EMSstatus% ()πDECLARE SUB ReleaseEMS (Handle%)πDECLARE SUB MapEMS (Handle%, block%)ππ'*** Memory manipulation routinesπDECLARE SUB MemCopy (fromseg, fromoff, toseg, tooff, numbytes)πDECLARE SUB FillChar (segment, offset, value, bytes)ππ'*** MiscelaneousπDECLARE SUB WaitRetrace ()ππOPTION BASE 0ππ'$STATICπDIM pal1(0 TO 255, 3) AS INTEGERπDIM pal2(0 TO 255, 3) AS INTEGERπDIM SHARED FontBuf(0) AS STRING * 10368ππ'$DYNAMICππLoadFontππSCREEN 13ππGetPal pal1()ππFontPalπGetPal pal2()πBlackOutππFont "BASIC FX", 50, 75, 3, 3, 3, 70πFadeIn pal2()ππWHILE INKEY$ = "": WENDπFadeOut pal2()πCLSππFont "The font routines were written by:", 0, 0, 1, 1, 3, 120πFont "Luke Molnar", 70, 25, 2, 2, 3, 1πFont "Other routines written/collected by:", 0, 100, 1, 1, 3, 120πFont "Jonathan Leger", 40, 125, 2, 2, 3, 1ππFadeIn pal2()ππWHILE INKEY$ = "": WENDππFadeOut pal2()πCLSππPutPal pal1()ππFont "LoadGif()", 115, 100, 1, 1, 5, 15πFont "press a key", 105, 125, 1, 1, 5, 15πWHILE INKEY$ = "": WENDππLoadGif "letterma.gif"ππFOR snd = 1000 TO 1500 STEP 100π SOUND snd, .1π SOUND snd + 100, .1π SOUND snd + 200, .1πNEXT sndππWHILE INKEY$ = "": WENDππCLSπPutPal pal1()ππFont "LoadPcx()", 115, 100, 1, 1, 5, 15πFont "press a key", 105, 125, 1, 1, 5, 15πWHILE INKEY$ = "": WENDππLoadPcx "bwface.pcx"πFOR snd = 1000 TO 1500 STEP 100π SOUND snd, .1π SOUND snd + 100, .1π SOUND snd + 200, .1πNEXT sndππWHILE INKEY$ = "": WENDππIF EMSstatus THENπ IF EMSPages(1) >= 4 THENπ PCXHandle = GetEMS(4)π MapEMS PCXHandle, 0π MemCopy &HA000, 0, PageFrame, 0, &HFA00π CLSπ Font "The previous picture has been", 0, 0, 1, 1, 5, 15π Font "loaded into EMS memory.", 0, 25, 1, 1, 5, 15π Font "Press any key to load picture.", 0, 50, 1, 1, 5, 15π WHILE INKEY$ = "": WENDπ MemCopy PageFrame, 0, &HA000, 0, &HFA00π WHILE INKEY$ = "": WENDπ ReleaseEMS PCXHandleπ END IFπEND IFππGetPal pal2()ππFont "CyclePal()", 115, 100, 1, 1, 5, 15ππDO UNTIL LEN(INKEY$) > 0π CyclePal 1, pal2(), 1πLOOPππBlackOutπCLSππFontPalπGetPal pal2()πFont "Making differnt color backgrounds", 0, 0, 1, 1, 5, 50πFont "is easy (and fast!) with ClrScr()...", 0, 25, 1, 1, 5, 50πFont "press a key", 105, 125, 1, 1, 5, 50πWHILE INKEY$ = "": WENDππRANDOMIZE TIMERπFOR x = 50 TO 200 STEP 40π ClrScr xπ DO: LOOP UNTIL LEN(INKEY$)πNEXT xππFillChar &HA000, 0, 0, &HFA00πBlackOutππFont "End of..", 0, 25, 1, 1, 5, 18πFont "BASIC FX", 50, 75, 3, 3, 3, 70πFont "...Demo", 240, 145, 1, 1, 5, 18πFadeIn pal2()ππWHILE INKEY$ = "": WENDπFadeOut pal2()πCLSπPutPal pal1()ππSCREEN 0πWIDTH 80, 25πENDππREM $STATICπSUB BlackOutππ FOR clr = 0 TO 255π OUT &H3C8, clrπ OUT &H3C9, 0π OUT &H3C9, 0π OUT &H3C9, 0π NEXT clrππEND SUBππSUB BsaveScreen (file$)ππDEF SEG = &HA000πBSAVE file$, 0, 64000πDEF SEGππEND SUBππSUB ClrScr (col)ππFillChar &HA000, 0, col, &HFA00ππEND SUBππSUB CyclePal (direction, pal(), numcycles)ππFOR x = 1 TO numcyclesπ WaitRetraceπ RotatePal direction, pal()πNEXT xππEND SUBππ'************* EMSPages%() ****************π'*** When func% is 0, returns the total ***π'*** number of 16k pages, when func% is ***π'*** 1, returns the number of available ***π'*** 16k pages. ***π'******************************************πFUNCTION EMSPages% (func%)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(180)πasm$ = asm$ + CHR$(66) + CHR$(205) + CHR$(103) + CHR$(139) + CHR$(126)πasm$ = asm$ + CHR$(6) + CHR$(137) + CHR$(29) + CHR$(139) + CHR$(126)πasm$ = asm$ + CHR$(8) + CHR$(137) + CHR$(21) + CHR$(93) + CHR$(203)ππTotalPages% = 0: AvailablePages% = 0ππDEF SEG = VARSEG(asm$)π CALL Absolute(TotalPages%, AvailablePages%, SADD(asm$))πDEF SEGππIF func% = 0 THENπ EMSPages% = TotalPages%πELSEπ EMSPages% = AvailablePages%πEND IFππEND FUNCTIONππ'**************** EMSstatus%() ******************π'*** Returns whether EMS is available. -1 is ***π'*** returned if it is available, 0 otherwise ***π'************************************************πFUNCTION EMSstatus%ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(180)πasm$ = asm$ + CHR$(64) + CHR$(205) + CHR$(103) + CHR$(176) + CHR$(0)πasm$ = asm$ + CHR$(139) + CHR$(94) + CHR$(6) + CHR$(137) + CHR$(7)πasm$ = asm$ + CHR$(93) + CHR$(203)ππEMS% = -1πDEF SEG = VARSEG(asm$)π CALL Absolute(EMS%, SADD(asm$))πDEF SEGππIF EMS% = 0 THENπ EMSstatus = -1 'EMS installed, set to BASIC's TRUE value.πELSEπ EMSstatus = 0 'EMS not installed, set to FALSE.πEND IFππEND FUNCTIONππSUB FadeIn (pal())ππDIM Tmp(0 TO 255, 3)ππFOR lp = 1 TO 64π FOR clr = 0 TO 255π FOR rgb = 1 TO 3π IF Tmp(clr, rgb) < pal(clr, rgb) THENπ Tmp(clr, rgb) = Tmp(clr, rgb) + 1π END IFπ NEXT rgbπ OUT &H3C8, clrπ OUT &H3C9, Tmp(clr, 1)π OUT &H3C9, Tmp(clr, 2)π OUT &H3C9, Tmp(clr, 3)π NEXT clrπNEXT lpπππEND SUBππSUB FadeOut (pal())ππDIM Tmp(0 TO 255, 3)ππFOR clr = 0 TO 255π FOR rgb = 1 TO 3π Tmp(clr, rgb) = pal(clr, rgb)π NEXT rgbπNEXT clrππFOR lp = 1 TO 64π FOR clr = 0 TO 255π FOR rgb = 1 TO 3π IF Tmp(clr, rgb) > 0 THENπ Tmp(clr, rgb) = Tmp(clr, rgb) - 1π END IFπ NEXT rgbπ OUT &H3C8, clrπ OUT &H3C9, Tmp(clr, 1)π OUT &H3C9, Tmp(clr, 2)π OUT &H3C9, Tmp(clr, 3)π NEXT clrπNEXT lpπππEND SUBππSUB FillChar (segment, offset, value, bytes)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(139)πasm$ = asm$ + CHR$(78) + CHR$(6) + CHR$(139) + CHR$(86) + CHR$(8)πasm$ = asm$ + CHR$(139) + CHR$(70) + CHR$(12) + CHR$(30) + CHR$(142)πasm$ = asm$ + CHR$(216) + CHR$(139) + CHR$(94) + CHR$(10) + CHR$(136)πasm$ = asm$ + CHR$(23) + CHR$(67) + CHR$(226) + CHR$(251) + CHR$(31)πasm$ = asm$ + CHR$(93) + CHR$(203)ππDEF SEG = VARSEG(asm$)π CALL Absolute(BYVAL segment, BYVAL offset, BYVAL value, BYVAL bytes, SADD(asm$))πDEF SEGππEND SUBππSUB Font (Text$, XStart, Ystart, Xscale, Yscale, Style, clr)ππpx = XStart ' physical x and physical yπpy = YstartππLHeight = Yscale * 8πOptimize = 63 \ LHeight ' Any constant math operations done multipe timesπ ' in the main loop should, well, not be doneπ ' in the main loop.πππ' Instead of wasting our time with all this MID$ garbage to access bytes inπ' font buffer, we'll just take a PEEK directly at them.πDEF SEG = VARSEG(FontBuf(0))ππ FOR h = 1 TO LEN(Text$)π FPtr = 81 * (ASC(MID$(Text$, h, 1)) - 1) - 1π FOR x = 0 TO 8π FOR y = 0 TO 8ππ col = PEEK(VARPTR(FontBuf(0)) + FPtr)π FPtr = FPtr + 1π IF col THENπ SELECT CASE Styleπ ' If you desire a y scale factor greater than 8, youπ ' must change the division to higher precision...very slow.π ' Or, you could find a way around it.π CASE 1: PSET (px, py), Optimize * (py - Ystart) + clrπ LINE (px, py)-(px, py + Yscale), Optimize * (py - Ystart) + clrπ ' Notice how this style only uses 54 colors, so you can see the topπ ' of the letters where they would normally be blackπ CASE 2: CIRCLE (px, py), Yscale, (54 \ LHeight) * (py - Ystart) + clr + 9, , , 4π CASE 3: FOR sty = px TO px + Xscaleπ FOR sty2 = py TO py + Yscaleπ PSET (sty, sty2), Optimize * (sty2 - Ystart) + clrπ IF POINT(sty - 1, sty2) = 0 THEN PSET (sty - 1, sty2), 63 + clr - 1π IF POINT(sty, sty2 - 1) = 0 THEN PSET (sty, sty2 - 1), 63 + clr - 1π NEXTπ NEXTπ CASE 4: FOR sty = px TO px + Xscaleπ FOR sty2 = py TO py + Yscaleπ PSET (sty + .4 * sty2, sty2), Optimize * (sty2 - Ystart) + clrπ IF POINT((sty - 1) + .4 * sty2, sty2) = 0 THEN PSET ((sty - 1) + .4 * sty2, sty2), 63 + clr - 1π NEXTπ NEXTπ CASE ELSEπ PSET (px, py), clrπ END SELECTπ END IFπ py = py + Yscaleπ NEXTπ px = px + Xscaleπ py = Ystartπ NEXTπ NEXT hπDEF SEGππEND SUBππSUB FontPalπFOR x = 1 TO 63π OUT &H3C8, xπ OUT &H3C9, xπ OUT &H3C9, 0π OUT &H3C9, 0πNEXTπFOR x = 64 TO 126π OUT &H3C8, xπ OUT &H3C9, 0π OUT &H3C9, xπ OUT &H3C9, 0πNEXTπFOR x = 127 TO 189π OUT &H3C8, xπ OUT &H3C9, 0π OUT &H3C9, 0π OUT &H3C9, xπNEXTπFOR x = 190 TO 252π OUT &H3C8, xπ OUT &H3C9, xπ OUT &H3C9, 0π OUT &H3C9, xπNEXTπFOR x = 253 TO 255π OUT &H3C8, xπ OUT &H3C9, xπ OUT &H3C9, xπ OUT &H3C9, xπNEXTπEND SUBππ'********************** GetEMS%() ********************π'*** Function returns the handle value for a block ***π'*** of EMS memory that consists of numpages% 16k ***π'*** pages. You _must_ keep the handle value for ***π'*** later calls that require the handle. Example:***π'*** ***π'*** EmsHandle% = GetEMS%(5) ***π'*** ***π'*** EmsHandle% holds the handle info for a block ***π'*** of memory 5 16k pages in size, oh 80k. ***π'*****************************************************πFUNCTION GetEMS% (numpages%)ππ'pageoffset% = EMSPages%(0) - EMSPages%(1)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(139)πasm$ = asm$ + CHR$(94) + CHR$(8) + CHR$(180) + CHR$(67) + CHR$(205)πasm$ = asm$ + CHR$(103) + CHR$(139) + CHR$(94) + CHR$(6) + CHR$(137)πasm$ = asm$ + CHR$(23) + CHR$(93) + CHR$(203)ππHandle% = 0πDEF SEG = VARSEG(asm$)π CALL Absolute(BYVAL numpages%, Handle%, SADD(asm$))πDEF SEGππ'asm$ = ""π'asm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(139)π'asm$ = asm$ + CHR$(86) + CHR$(8) + CHR$(139) + CHR$(126) + CHR$(6)π'asm$ = asm$ + CHR$(139) + CHR$(118) + CHR$(10) + CHR$(177) + CHR$(0)π'asm$ = asm$ + CHR$(48) + CHR$(237) + CHR$(180) + CHR$(68) + CHR$(136)π'asm$ = asm$ + CHR$(200) + CHR$(137) + CHR$(243) + CHR$(205) + CHR$(103)π'asm$ = asm$ + CHR$(70) + CHR$(65) + CHR$(57) + CHR$(254) + CHR$(117)π'asm$ = asm$ + CHR$(242) + CHR$(93) + CHR$(203)π'π'DEF SEG = VARSEG(asm$)π' CALL Absolute(BYVAL pageoffset%, BYVAL Handle%, BYVAL numpages%, SADD(asm$))π'DEF SEGππGetEMS% = Handle%ππEND FUNCTIONππSUB GetPal (pal())π FOR clr = 0 TO 255π OUT &H3C7, clrπ pal(clr, 1) = INP(&H3C9)π pal(clr, 2) = INP(&H3C9)π pal(clr, 3) = INP(&H3C9)π NEXT clrπEND SUBππSUB GiftoBSAVE (gif$, bsave$, pal$)ππLoadGif gif$πBsaveScreen bsave$πSavePal pal$ππEND SUBππSUB LoadFontππ fontfile = FREEFILEππ OPEN "basefont.dat" FOR BINARY AS #fontfileππ IF LOF(fontfile) < 20655 THENπ SCREEN 0: WIDTH 80, 25π COLOR 7π PRINT "Font data file missing or corrupt. Rebuild it? [(Y)/n]";π DOπ key$ = UCASE$(INKEY$)π LOOP UNTIL key$ = "N" OR key$ = "Y"π CLOSE fontfileπ IF key$ = "N" THEN EXIT SUBπ MakeFontπ fontfile = FREEFILEπ OPEN "basefont.dat" FOR BINARY AS #fontfileπ END IFππ GET #fontfile, , FontBuf(0)π CLOSE #fontfileππEND SUBππSUB LoadGif (file$)πDIM byte AS STRING * 1πDIM Prefix(4095), Suffix(4095), OutStack(4095), shiftout(8)πDIM Ybase AS LONG, powersof2(11) AS LONG, WorkCode AS LONGππFOR a = 0 TO 7: shiftout(8 - a) = 2 ^ a: NEXT aπFOR a = 0 TO 11: powersof2(a) = 2 ^ a: NEXT aππgiffile = FREEFILEπOPEN file$ FOR BINARY AS #giffileπfile$ = " ": GET #giffile, , file$πIF file$ <> "GIF87a" THEN PRINT "Not a GIF87a file.": ENDπGET #giffile, , TotalX: GET #giffile, , TotalY: GOSUB GetByteπNumColors = 2 ^ ((a AND 7) + 1): NoPalette = (a AND 128) = 0πGOSUB GetByte: Background = aπGOSUB GetByte: IF a <> 0 THEN PRINT "Bad screen descriptor.": ENDπIF NoPalette = 0 THEN P$ = SPACE$(NumColors * 3): GET #giffile, , P$πDOπ GOSUB GetByteπ IF a = 44 THENπ EXIT DOπ ELSEIF a <> 33 THENπ PRINT "Unknown extension type.": ENDπ END IFπ GOSUB GetByteπ DO: GOSUB GetByte: file$ = SPACE$(a): GET #giffile, , file$: LOOP UNTIL a = 0πLOOPπGET #giffile, , XStart: GET #giffile, , Ystart: GET #giffile, , XLength: GET #giffile, , YLengthπXEnd = XStart + XLength: YEnd = Ystart + YLength: GOSUB GetByteπIF a AND 128 THEN PRINT "Can't handle local colormaps.": ENDπInterlaced = a AND 64: PassNumber = 0: PassStep = 8πGOSUB GetByteπClearCode = 2 ^ aπEOSCode = ClearCode + 1πFirstCode = ClearCode + 2: NextCode = FirstCodeπStartCodeSize = a + 1: CodeSize = StartCodeSizeπStartMaxCode = 2 ^ (a + 1) - 1: MaxCode = StartMaxCodeππBitsIn = 0: BlockSize = 0: BlockPointer = 1πx = XStart: y = Ystart: Ybase = y * 320&ππIF ActivePageNum = VisiblePageNum THENπ DEF SEG = &HA000πELSEπ DEF SEG = VideoSegmentπEND IFππIF NoPalette = 0 THENπ OUT &H3C7, 0: OUT &H3C8, 0π FOR a = 1 TO NumColors * 3: OUT &H3C9, ASC(MID$(P$, a, 1)) \ 4: NEXT aπEND IFπLINE (0, 0)-(319, 199), Background, BFπDOπ GOSUB GetCodeπ IF Code <> EOSCode THENπ IF Code = ClearCode THENπ NextCode = FirstCodeπ CodeSize = StartCodeSizeπ MaxCode = StartMaxCodeπ GOSUB GetCodeπ CurCode = Code: LastCode = Code: LastPixel = Codeπ IF x < 320 THEN POKE x + Ybase, LastPixelπ x = x + 1: IF x = XEnd THEN GOSUB NextScanLineπ ELSEπ CurCode = Code: StackPointer = 0π IF Code > NextCode THEN EXIT DOπ IF Code = NextCode THENπ CurCode = LastCodeπ OutStack(StackPointer) = LastPixelπ StackPointer = StackPointer + 1π END IFππ DO WHILE CurCode >= FirstCodeπ OutStack(StackPointer) = Suffix(CurCode)π StackPointer = StackPointer + 1π CurCode = Prefix(CurCode)π LOOPππ LastPixel = CurCodeπ IF x < 320 THEN POKE x + Ybase, LastPixelπ x = x + 1: IF x = XEnd THEN GOSUB NextScanLineππ FOR a = StackPointer - 1 TO 0 STEP -1π IF x < 320 THEN POKE x + Ybase, OutStack(a)π x = x + 1: IF x = XEnd THEN GOSUB NextScanLineπ NEXT aππ IF NextCode < 4096 THENπ Prefix(NextCode) = LastCodeπ Suffix(NextCode) = LastPixelπ NextCode = NextCode + 1π IF NextCode > MaxCode AND CodeSize < 12 THENπ CodeSize = CodeSize + 1π MaxCode = MaxCode * 2 + 1π END IFπ END IFπ LastCode = Codeπ END IFπ END IFπLOOP UNTIL DoneFlag OR Code = EOSCodeπGOTO LeaveProcππGetByte: file$ = " ": GET #giffile, , file$: a = ASC(file$): RETURNππNextScanLine:π IF Interlaced THENπ y = y + PassStepπ IF y >= YEnd THENπ PassNumber = PassNumber + 1π SELECT CASE PassNumberπ CASE 1: y = 4: PassStep = 8π CASE 2: y = 2: PassStep = 4π CASE 3: y = 1: PassStep = 2π END SELECTπ END IFπ ELSEπ y = y + 1π END IFπ x = XStart: Ybase = y * 320&: DoneFlag = y > 199πRETURNπGetCode:π IF BitsIn = 0 THEN GOSUB ReadBufferedByte: LastChar = a: BitsIn = 8π WorkCode = LastChar \ shiftout(BitsIn)π DO WHILE CodeSize > BitsInπ GOSUB ReadBufferedByte: LastChar = aπ WorkCode = WorkCode OR LastChar * powersof2(BitsIn)π BitsIn = BitsIn + 8π LOOPπ BitsIn = BitsIn - CodeSizeπ Code = WorkCode AND MaxCodeπRETURNπReadBufferedByte:π IF BlockPointer > BlockSize THENπ GOSUB GetByte: BlockSize = aπ file$ = SPACE$(BlockSize): GET #giffile, , file$π BlockPointer = 1π END IFπ a = ASC(MID$(file$, BlockPointer, 1)): BlockPointer = BlockPointer + 1πRETURNπLeaveProc:πCLOSEππEND SUBππSUB LoadPal (file$)ππpalfile = FREEFILEπOPEN file$ FOR BINARY AS palfileππFOR clr = 0 TO 255π OUT &H3C8, clrπ OUT &H3C9, ASC(INPUT$(1, palfile))π OUT &H3C9, ASC(INPUT$(1, palfile))π OUT &H3C9, ASC(INPUT$(1, palfile))πNEXT clrππCLOSE palfileππEND SUBππSUB LoadPcx (file$)ππ SCREEN 13ππ DIM pcxpal AS STRING * 768, pcxversion AS STRING * 1ππ pcxnum = FREEFILEπ OPEN file$ FOR BINARY AS #pcxnumππ IF LOF(pcxnum) = 0 THENπ CLOSE pcxnumπ KILL file$π EXIT SUBπ END IFππ GET #pcxnum, 2, pcxversionππ IF ASC(pcxversion) = 5 THENπ GET #1, LOF(pcxnum) - 767, pcxpalπ pal = 0π FOR P = 1 TO 768 STEP 3π OUT &H3C8, palπ red% = INT(ASC(MID$(pcxpal, P, 1)) / 4)π OUT &H3C9, red%π green% = INT(ASC(MID$(pcxpal, P + 1, 1)) / 4)π OUT &H3C9, green%π blue% = INT(ASC(MID$(pcxpal, P + 2, 1)) / 4)π OUT &H3C9, blue%π pal = pal + 1π NEXT Pπ END IFπ π SEEK #pcxnum, 129π π fxoffset = 0: fxsegment = &HA000ππ datasize = 2000π π pcxdata$ = INPUT$(datasize, pcxnum)π datacount = 1π FOR half = 1 TO 2π fxtotal = fxsegment + fxoffsetπ DEF SEG = fxtotalπ FOR c = 0 TO 31999π IF datacount > datasize THENπ pcxdata$ = INPUT$(datasize, pcxnum)π datacount = 1π END IFπ clr = ASC(MID$(pcxdata$, datacount, 1))π datacount = datacount + 1π IF datacount > datasize THENπ pcxdata$ = INPUT$(datasize, pcxnum)π datacount = 1π END IFπ IF clr > 192 THENπ LPS = clr - 192π clr = ASC(MID$(pcxdata$, datacount, 1))π datacount = datacount + 1π FOR L = LPS TO 1 STEP -1π POKE c, clrπ c = c + 1π NEXT Lπ c = c - 1π ELSEπ POKE c, clrπ END IFπ NEXT cπ fxoffset = fxoffset + &H7D0π NEXT halfππ CLOSE pcxnumππ DEF SEGππEND SUBππSUB MakeFontππfontfile = FREEFILEππOPEN "basefont.dat" FOR BINARY AS #fontfileπ' Hey, change 128 to 255 for the full font.πCLSπSCREEN 13πCOLOR 16πFOR ascii = 1 TO 255π CLSπ PRINT CHR$(ascii)π FOR x = 0 TO 8π FOR y = 0 TO 8π pnt$ = CHR$(POINT(x, y))π PUT #fontfile, , pnt$π pnt$ = ""π NEXTπ NEXTπNEXTπCLOSEπOPEN "basefont.dat" FOR BINARY AS #fontfileπ GET #fontfile, , FontBuf(0)πCLOSE #fontfileπEND SUBππ'***************** MapEMS () ***********************************π'*** Sets the page of a memory block (identified by Handle%) ***π'*** that is located at the beginning of the page frame. ***π'*** Example: ***π'*** ***π'*** EmsHandle% = GetEMS%(8) ***π'*** MapEMS EmsHandle%, 4 ***π'*** ***π'*** When the page frame segment is next written to, the info***π'*** will be placed starting at the 4th page in the block of ***π'*** memory represented by EmsHandle%. This could be use, ***π'*** for instance, to store multiple SCREEN 13 images in one ***π'*** EMS block, by moving the first 64k image into the first ***π'*** 4 16k pages (16000 * 4 = 64000) by using: ***π'*** ***π'*** MapEMS EmsHandle%, 0 ***π'*** ***π'*** And then putting the next 64k image into the next 4 EMS ***π'*** pages by using: ***π'*** ***π'*** MapEMS EmsHandle%, 4 ***π'*** ***π'*** ... and then moving the image into the memory block. ***π'***************************************************************πSUB MapEMS (Handle%, pageoffset%)ππnumpages% = 4ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(139)πasm$ = asm$ + CHR$(86) + CHR$(8) + CHR$(139) + CHR$(126) + CHR$(6)πasm$ = asm$ + CHR$(139) + CHR$(118) + CHR$(10) + CHR$(177) + CHR$(0)πasm$ = asm$ + CHR$(48) + CHR$(237) + CHR$(180) + CHR$(68) + CHR$(136)πasm$ = asm$ + CHR$(200) + CHR$(137) + CHR$(243) + CHR$(205) + CHR$(103)πasm$ = asm$ + CHR$(70) + CHR$(65) + CHR$(57) + CHR$(249) + CHR$(117)πasm$ = asm$ + CHR$(242) + CHR$(93) + CHR$(203)ππDEF SEG = VARSEG(asm$)π CALL Absolute(BYVAL pageoffset%, BYVAL Handle%, BYVAL numpages%, SADD(asm$))πDEF SEGππEND SUBππSUB MemCopy (fromseg, fromoff, toseg, tooff, bytes)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(30)πasm$ = asm$ + CHR$(139) + CHR$(70) + CHR$(10) + CHR$(142) + CHR$(192)πasm$ = asm$ + CHR$(139) + CHR$(70) + CHR$(14) + CHR$(142) + CHR$(216)πasm$ = asm$ + CHR$(139) + CHR$(118) + CHR$(8) + CHR$(139) + CHR$(126)πasm$ = asm$ + CHR$(12) + CHR$(139) + CHR$(78) + CHR$(6) + CHR$(243)πasm$ = asm$ + CHR$(164) + CHR$(31) + CHR$(93) + CHR$(203)ππDEF SEG = VARSEG(asm$)π CALL Absolute(BYVAL fromseg, BYVAL fromoff, BYVAL toseg, BYVAL tooff, BYVAL bytes, SADD(asm$))πDEF SEGππEND SUBππ'****************************** NumEMSHandles%() *********************π'*** Returns the number of EMS handles presently being used (there ***π'*** are a maximum of 256 handles possible at any given time). ***π'*********************************************************************πFUNCTION NumEMSHandles%ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(180)πasm$ = asm$ + CHR$(75) + CHR$(205) + CHR$(103) + CHR$(139) + CHR$(126)πasm$ = asm$ + CHR$(6) + CHR$(137) + CHR$(29) + CHR$(93) + CHR$(203)ππNumHandles% = 0πDEF SEG = VARSEG(asm$)π CALL Absolute(NumHandles%, SADD(asm$))πDEF SEGππNumEMSHandles% = NumHandles%ππEND FUNCTIONππ'***************************** NumEMSPages%() *************************π'*** Returns the number of 16k pages being used by the memory block ***π'*** that is represented by Handle%. ***π'**********************************************************************πFUNCTION NumEMSPages% (Handle%)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(139)πasm$ = asm$ + CHR$(86) + CHR$(6) + CHR$(180) + CHR$(76) + CHR$(205)πasm$ = asm$ + CHR$(103) + CHR$(139) + CHR$(126) + CHR$(8) + CHR$(137)πasm$ = asm$ + CHR$(29) + CHR$(93) + CHR$(203)ππDEF SEG = VARSEG(asm$)π CALL Absolute(numpages%, Handle%, SADD(asm$))πDEF SEGππNumEMSPages% = numpages%ππEND FUNCTIONππ'******************************* PageFrame% ***************************π'*** Returns the segment that you will need to write to in order to ***π'*** store your data into EMS memory. For example, PageFrame% may ***π'*** return D000 (HEX, -12288 decimal), and then you might do this: ***π'*** ***π'*** DEF SEG = PageFrame% 'D000 ***π'*** MyData$ = "This is a block of data I want to store in EMS." ***π'*** FOR X = 1 TO LEN(MyData$) ***π'*** POKE X, ASC(MID$(MyData$, X, 1)) ***π'*** NEXT X ***π'*** DEF SEG ***π'*** ***π'*** Note, though, that you have to have a block of EMS opened with ***π'*** GetEMS%() and maped with MapEMS before you can write to the ***π'*** block. ***π'**********************************************************************πFUNCTION PageFrame%ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(180)πasm$ = asm$ + CHR$(65) + CHR$(205) + CHR$(103) + CHR$(139) + CHR$(126)πasm$ = asm$ + CHR$(6) + CHR$(137) + CHR$(29) + CHR$(93) + CHR$(203)ππPageFrameAddr% = 0πDEF SEG = VARSEG(asm$)π CALL Absolute(PageFrameAddr%, SADD(asm$))πDEF SEGππPageFrame% = PageFrameAddr%ππEND FUNCTIONππSUB PutPal (pal())π π FOR clr = 0 TO 255π OUT &H3C8, clrπ OUT &H3C9, pal(clr, 1)π OUT &H3C9, pal(clr, 2)π OUT &H3C9, pal(clr, 3)π NEXT clrππEND SUBππ'****************************** ReleaseEMS() **************************π'*** Releases the EMS memory associated with Handle%. This is very ***π'*** important to do before you exit your program, otherwise the ***π'*** memory being used by your open handles will not be available ***π'*** again until you reboot. ***π'**********************************************************************πSUB ReleaseEMS (Handle%)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(180)πasm$ = asm$ + CHR$(69) + CHR$(139) + CHR$(86) + CHR$(6) + CHR$(205)πasm$ = asm$ + CHR$(103) + CHR$(93) + CHR$(203)ππDEF SEG = VARSEG(asm$)π CALL Absolute(BYVAL Handle%, SADD(asm$))πDEF SEGππEND SUBππSUB RotatePal (direction, pal())ππ SELECT CASE directionπ CASE 1π temp1 = pal(255, 1)π temp2 = pal(255, 2)π temp3 = pal(255, 3)π FOR rgb = 1 TO 3π FOR col = 254 TO 0 STEP -1π pal(col + 1, rgb) = pal(col, rgb)π NEXT colπ NEXT rgbπ pal(0, 1) = temp1π pal(0, 2) = temp2π pal(0, 3) = temp3π CASE -1π temp1 = pal(0, 1)π temp2 = pal(0, 2)π temp3 = pal(0, 3)π FOR rgb = 1 TO 3π FOR col = 0 TO 254π pal(col, rgb) = pal(col + 1, rgb)π NEXT colπ NEXT rgbπ pal(255, 1) = temp1π pal(255, 2) = temp2π pal(255, 3) = temp3π END SELECTππ PutPal pal()ππEND SUBππSUB SavePal (file$)ππ palfile = FREEFILEπ OPEN file$ FOR OUTPUT AS palfileππ FOR clr = 0 TO 255π OUT &H3C7, clrπ PRINT #palfile, CHR$(INP(&H3C9));π PRINT #palfile, CHR$(INP(&H3C9));π PRINT #palfile, CHR$(INP(&H3C9));π NEXT clrππ CLOSE palfileππEND SUBππSUB SetPal (pal())πEND SUBππSUB WaitRetraceπ WAIT &H3DA, 8πEND SUBπRyan White VORTEX BIGFOOT@SunBelt.Net 09-06-96 (11:42) QB, QBasic, PDS 39 2397 VORTEX.BAS 'Vortexπ'By Ryan Whiteπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net or Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...πππ'This one is much faster compiled. A little too fast.ππSCREEN 13πDEFINT A-WπCLSπDIM c(255, 2), co(255, 2)πFOR n = 0 TO 15πc(n, 0) = n * 4: c(n, 1) = n * 4: c(n, 2) = n * 4: c(n + 16, 0) = 63: c(n + 16, 1) = 63 - n * 4: c(n + 16, 2) = 63 - n * 4: c(n + 32, 0) = 63: c(n + 32, 1) = n * 2: c(n + 32, 2) = 0πc(n + 48, 0) = 63: c(n + 48, 1) = n * 2 + 31: c(n + 48, 2) = 0: c(n + 64, 0) = 63 - n * 4: c(n + 64, 1) = 63: c(n + 64, 2) = 0: c(n + 80, 0) = 0: c(n + 80, 1) = 63 - n * 2: c(n + 80, 2) = n * 4πc(n + 96, 0) = 0: c(n + 96, 1) = 32 - n * 2: c(n + 96, 2) = 60: c(n + 112, 0) = n * 3: c(n + 112, 1) = 0: c(n + 112, 2) = 60: c(n + 128, 0) = 45 - n * 3: c(n + 128, 1) = 0: c(n + 128, 2) = 60πc(n + 144, 0) = 0: c(n + 144, 1) = n * 2: c(n + 144, 2) = 60: c(n + 160, 0) = 0: c(n + 160, 1) = 30 + n * 2: c(n + 160, 2) = 60 - n * 4: c(n + 176, 0) = n * 4: c(n + 176, 1) = 63: c(n + 176, 2) = 0πc(n + 192, 0) = 63: c(n + 192, 1) = 60 - n * 2: c(n + 192, 2) = 0: c(n + 208, 0) = 63: c(n + 208, 1) = 30 - n * 2: c(n + 208, 2) = 0: c(n + 224, 0) = 60 - n * 2: c(n + 224, 1) = n * 2: c(n + 224, 2) = n * 2πc(n + 240, 0) = 30 - n * 2: c(n + 240, 1) = 30 - n * 2: c(n + 240, 2) = 30 - n * 2: NEXT n: FOR n = 1 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nππn = 0: x = 5πFOR I = 200 TO 40 STEP -1: n = n + 1: IF n = 256 THEN n = 1πx = x / 1.003: FOR j = 1 TO 10: CIRCLE (160, I), x, n, , , .5: x = x * 1.003: NEXT jπNEXT Iππ'FOR n = -15 TO 15:LINE (105 + n, 65 + n)-(215 - n, 175 - n), 50 + n, B:NEXT nπ'FOR n = 1 TO 33:FOR m = -1 TO 1:CIRCLE (110, 170 + m), n, 255 - n, , , 1:CIRCLE (210, 170 + m), n, 255 - n, , , 1:CIRCLE (110, 70 + m), n, 255 - n, , , 1:CIRCLE (210, 70 + m), n, 255 - n, , , 1:NEXT m:NEXT nππDO UNTIL INKEY$ <> ""πFOR n = 1 TO 255: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπc(255, 0) = co(1, 0): c(255, 1) = co(1, 1): c(255, 2) = co(1, 2)πFOR n = 1 TO 254: FOR m = 0 TO 2: c(n, m) = co(n + 1, m): NEXT m: NEXT nπFOR n = 1 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nπLOOPπππRyan White COLOR MORPH BIGFOOT@SunBelt.Net 09-06-96 (12:31) QB, QBasic, PDS 80 2929 CMORPH.BAS 'color morphπ'By Ryan Whiteπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net or Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππSCREEN 13πCLSπDEFINT A-ZπDIM c(255, 2), co(255, 2)πFOR n = 0 TO 15π'black white red orange yellow green blue's purple ~then backwards~π'0-15 black to whiteπc(n, 0) = n * 4: c(n, 1) = n * 4: c(n, 2) = n * 4π'16-31 white to redπc(n + 16, 0) = 63: c(n + 16, 1) = 63 - n * 4: c(n + 16, 2) = 63 - n * 4π'32-47 red to orangeπc(n + 32, 0) = 63: c(n + 32, 1) = n * 2: c(n + 32, 2) = 0π'48-63 orange to yellowπc(n + 48, 0) = 63: c(n + 48, 1) = n * 2 + 31: c(n + 48, 2) = 0π'64-79 yellow to greenπc(n + 64, 0) = 63 - n * 4: c(n + 64, 1) = 63: c(n + 64, 2) = 0π'80-95 green to l.blueπc(n + 80, 0) = 0: c(n + 80, 1) = 63 - n * 2: c(n + 80, 2) = n * 4π'96-111 l.blue to d.blueπc(n + 96, 0) = 0: c(n + 96, 1) = 32 - n * 2: c(n + 96, 2) = 60π'112-127 d.blue to purpleπc(n + 112, 0) = n * 3: c(n + 112, 1) = 0: c(n + 112, 2) = 60π'128-143 purple to d.blueπc(n + 128, 0) = 45 - n * 3: c(n + 128, 1) = 0: c(n + 128, 2) = 60π'144-159 d.blue to l.blueπc(n + 144, 0) = 0: c(n + 144, 1) = n * 2: c(n + 144, 2) = 60π'160-175 l.blue to greenπc(n + 160, 0) = 0: c(n + 160, 1) = 30 + n * 2: c(n + 160, 2) = 60 - n * 4π'176-191 green to yellowπc(n + 176, 0) = n * 4: c(n + 176, 1) = 63: c(n + 176, 2) = 0π'192-207 yellow to orangeπc(n + 192, 0) = 63: c(n + 192, 1) = 60 - n * 2: c(n + 192, 2) = 0π'208-223 orange to redπc(n + 208, 0) = 63: c(n + 208, 1) = 30 - n * 2: c(n + 208, 2) = 0π'224-239 red to grayπc(n + 224, 0) = 60 - n * 2: c(n + 224, 1) = n * 2: c(n + 224, 2) = n * 2π'240-255 gray to blackπc(n + 240, 0) = 30 - n * 2: c(n + 240, 1) = 30 - n * 2: c(n + 240, 2) = 30 - n * 2πNEXT nπFOR n = 1 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nππFOR x = 0 TO 319πc = c + 1: IF c = 256 THEN c = 1πLINE (x, 0)-(159, 100), cπNEXT xπFOR y = 0 TO 199πc = c + 1: IF c = 256 THEN c = 1πLINE (319, y)-(159, 100), cπNEXT yπFOR x = 319 TO 0 STEP -1πc = c + 1: IF c = 256 THEN c = 1πLINE (x, 199)-(159, 100), cπNEXT xπFOR y = 199 TO 0 STEP -1πc = c + 1: IF c = 256 THEN c = 1πLINE (0, y)-(159, 100), cπNEXT yππFOR r = 60 TO 1 STEP -1πFOR m = -1 TO 1πc = c + 1: IF c = 256 THEN c = 1πCIRCLE (159, 100 + m), r, c, , , 1πNEXT mπNEXT rππDO UNTIL INKEY$ <> ""πFOR n = 1 TO 255: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπc(255, 0) = co(1, 0): c(255, 1) = co(1, 1): c(255, 2) = co(1, 2)πFOR n = 1 TO 254: FOR m = 0 TO 2: c(n, m) = co(n + 1, m): NEXT m: NEXT nπFOR n = 1 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nπLOOPππRyan White FLYING BEES #2 BIGFOOT@SunBelt.Net 09-06-96 (12:31) QB, QBasic, PDS 131 4288 FLYBEES2.BASDECLARE SUB wasp (wx%(), wy%())πDECLARE SUB bees (wx%(), wy%(), x%(), y%(), xv%(), yv%(), bcolor%)πDEFINT A-ZπCOMMON SHARED winW, winH, winX, winY, border, NoBees, smoothππ'Flybees #2π'By Ryan White Original source by Richard Daleπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net or Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππ'Just mess with it to learn. I just thought his was neat enough to maybe beπ'cooler. It was.πππON KEY(1) GOSUB cle: KEY(1) ONπON KEY(2) GOSUB ss: KEY(2) ONπON KEY(3) GOSUB smoothhuh: KEY(3) ONππDEFLNG T: CLSππNoBees = 40ππSCREEN 12: RANDOMIZE TIMER: CLSπGOSUB ssπDIM wx(0 TO 2), wy(0 TO 2), co(15, 2), cn(15, 2)πDIM x(0 TO 2, 1 TO NoBees): DIM y(0 TO 2, 1 TO NoBees)πDIM xv(1 TO NoBees): DIM yv(1 TO NoBees)πwinW = 0: winH = 0: winX = 0: winY = 0: maxx = 640: maxy = 480π' wasp will not go closer than this to the edgesπ border = INT(RND * 75): winW = maxx: winH = maxyπ' Initialize the waspπ wx(0) = 640 / 2: wy(0) = 480 / 2: wx(1) = wx(0): wy(1) = wy(0)π'Initialize the beesπ FOR b = 1 TO NoBeesπ x(0, b) = INT(RND * winW): x(1, b) = x(0, b)π y(0, b) = INT(RND * winH): y(1, b) = y(0, b)π xv(b) = 7 * (RND - .5): yv(b) = 7 * (RND - .5)π NEXT bπ DO UNTIL INKEY$ <> ""π CALL wasp(wx(), wy()): CALL bees(wx(), wy(), x(), y(), xv(), yv(), bcolor)π GOSUB dinπ bcolor = bcolor + 1π IF bcolor = 15 THEN bcolor = 1π LOOP: SCREEN 0πENDππcle:πCLSπRETURNππss:πrr = INT(RND * 5): gr = INT(RND * 5): br = INT(RND * 5)πFOR n = 1 TO 14πOUT &H3C8, nπOUT &H3C9, n * rr + 3πOUT &H3C9, n * gr + 3πOUT &H3C9, n * br + 3πNEXT nπRETURNππdin:πFOR n = 14 TO 1 STEP -1: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπcn(1, 0) = co(14, 0): cn(1, 1) = co(14, 1): cn(1, 2) = co(14, 2)πFOR n = 14 TO 2 STEP -1: FOR m = 0 TO 2: cn(n, m) = co(n - 1, m): NEXT m: NEXT nπFOR n = 14 TO 1 STEP -1: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπRETURNππsmoothhuh:πsmooth = smooth - 1: IF smooth = -1 THEN smooth = 1πRETURNππDEFINT TπSUB bees (wx(), wy(), x(), y(), xv(), yv(), bcolor)π' Do not let things settle downπ bb = INT(NoBees * RND + 1)π xv(bb) = xv(bb) + (RND - .5) * 3: yv(bb) = yv(bb) + (RND - .5) * 3πFOR b = 1 TO NoBeesπ' Age position arraysπ x(2, b) = x(1, b): y(2, b) = y(1, b)π x(1, b) = x(0, b): y(1, b) = y(0, b)π dx = wx(1) - x(1, b): dy = wy(1) - y(1, b)π distance = ABS(dx) + ABS(dy) ' Approximationπ IF distance = 0 THEN distance = 1π bee.acc = 3π' Accelerateπ xv(b) = xv(b) + dx * bee.acc / distanceπ yv(b) = yv(b) + dy * bee.acc / distanceπ bee.vel = 11π' Speed Checksπ IF xv(b) > bee.vel THEN xv(b) = bee.velπ IF xv(b) < -bee.vel THEN xv(b) = -bee.velπ IF yv(b) > bee.vel THEN yv(b) = bee.velπ IF yv(b) < -bee.vel THEN yv(b) = -bee.velπ' Move the beesπ IF smooth = 1 THEN 'non smoothπ x(0, b) = x(1, b) + INT(RND * xv(b) + .25 * xv(b)): y(0, b) = y(1, b) + INT(RND * yv(b) + .25 * yv(b))π END IFπ IF smooth = 0 THEN 'smoothπ x(0, b) = x(1, b) + xv(b): y(0, b) = y(1, b) + yv(b)π END IFπ LINE (x(0, b), y(0, b))-(x(1, b), y(1, b)), bcolorπ NEXT bπEND SUBππSUB wasp (wx(), wy()) STATICπ' Age the arraysπ wx(2) = wx(1): wx(1) = wx(0): wy(2) = wy(1): wy(1) = wy(0)π' Accelerate (bias random variable to ensure wasp convers entire screen)π wasp.acc = 5π wxv = wxv + INT((RND - .4) * wasp.acc)π wyv = wyv + INT((RND - .4) * wasp.acc)π' Speed limit checksπ wxv.max = INT(RND * 30) + 20: wyv.max = INT(RND * 30) + 20π IF wxv > wxv.max THEN wxv = wxv.maxπ IF wxv < -wxv.max THEN wxv = -wxv.maxπ IF wyv > wyv.max THEN wyv = wyv.maxπ IF wyv < -wyv.max THEN wyv = -wyv.maxπ' Move waspπ wx(0) = wx(1) + wxv: wy(0) = wy(1) + wyvπ' Bounce checksπ IF wx(0) < border OR wx(0) > winW - border - 1 THENπ wxv = -wxv: wx(0) = wx(0) + wxvπ END IFπ IF wy(0) < border OR wy(0) > winH - border - 1 THENπ wyv = -wyv: wy(0) = wy(0) + wyvπ END IFπEND SUBππRyan White FLYING BEES #8 BIGFOOT@SunBelt.Net 09-06-96 (12:31) QB, QBasic, PDS 135 4506 FLYBEES8.BASDECLARE SUB wasp (wx%(), wy%())πDECLARE SUB bees (wx%(), wy%(), x%(), y%(), xv%(), yv%(), bcolor%)πDEFINT A-ZπCOMMON SHARED winW, winH, winX, winY, border, NoBees, smoothππ'Flybees #8π'By Ryan White Original source by Richard Daleπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net or Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππ'Just mess with it to learn. I just thought his was neat enough to maybe beπ'cooler. It was.ππππON KEY(1) GOSUB cle: KEY(1) ONπON KEY(2) GOSUB ss: KEY(2) ONπON KEY(3) GOSUB smoothhuh: KEY(3) ONππDEFLNG T: CLSππNoBees = 40ππSCREEN 12: RANDOMIZE TIMER: CLSπGOSUB ssπDIM wx(0 TO 2), wy(0 TO 2), co(15, 2), cn(15, 2)πDIM x(0 TO 2, 1 TO NoBees): DIM y(0 TO 2, 1 TO NoBees)πDIM xv(1 TO NoBees): DIM yv(1 TO NoBees)πwinW = 0: winH = 0: winX = 0: winY = 0: maxx = 640: maxy = 480π' wasp will not go closer than this to the edgesπ border = INT(RND * 75): winW = maxx: winH = maxyπ' Initialize the waspπ wx(0) = 640 / 2: wy(0) = 480 / 2: wx(1) = wx(0): wy(1) = wy(0)π'Initialize the beesπ FOR b = 1 TO NoBeesπ x(0, b) = INT(RND * winW): x(1, b) = x(0, b)π y(0, b) = INT(RND * winH): y(1, b) = y(0, b)π xv(b) = 7 * (RND - .5): yv(b) = 7 * (RND - .5)π NEXT bπ DO UNTIL INKEY$ <> ""π CALL wasp(wx(), wy()): CALL bees(wx(), wy(), x(), y(), xv(), yv(), bcolor)π GOSUB dinπ bcolor = bcolor + 1π IF bcolor = 15 THEN bcolor = 1π LOOP: SCREEN 0πENDππcle:πCLSπRETURNππss:πrr = INT(RND * 5): gr = INT(RND * 5): br = INT(RND * 5)πFOR n = 1 TO 14πOUT &H3C8, nπOUT &H3C9, n * rr + 3πOUT &H3C9, n * gr + 3πOUT &H3C9, n * br + 3πNEXT nπRETURNππdin:πFOR n = 14 TO 1 STEP -1: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπcn(1, 0) = co(14, 0): cn(1, 1) = co(14, 1): cn(1, 2) = co(14, 2)πFOR n = 14 TO 2 STEP -1: FOR m = 0 TO 2: cn(n, m) = co(n - 1, m): NEXT m: NEXT nπFOR n = 14 TO 1 STEP -1: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπRETURNππsmoothhuh:πsmooth = smooth - 1: IF smooth = -1 THEN smooth = 1πRETURNππDEFINT TπSUB bees (wx(), wy(), x(), y(), xv(), yv(), bcolor)π' Do not let things settle downπ bb = INT(NoBees * RND + 1)π xv(bb) = xv(bb) + (RND - .5) * 3: yv(bb) = yv(bb) + (RND - .5) * 3πFOR b = 1 TO NoBeesπ' Age position arraysπ x(2, b) = x(1, b): y(2, b) = y(1, b)π x(1, b) = x(0, b): y(1, b) = y(0, b)π dx = wx(1) - x(1, b): dy = wy(1) - y(1, b)π distance = ABS(dx) + ABS(dy) ' Approximationπ IF distance = 0 THEN distance = 1π bee.acc = 3π' Accelerateπ xv(b) = xv(b) + dx * bee.acc / distanceπ yv(b) = yv(b) + dy * bee.acc / distanceπ bee.vel = 11π' Speed Checksπ IF xv(b) > bee.vel THEN xv(b) = bee.velπ IF xv(b) < -bee.vel THEN xv(b) = -bee.velπ IF yv(b) > bee.vel THEN yv(b) = bee.velπ IF yv(b) < -bee.vel THEN yv(b) = -bee.velπ' Move the beesπ IF smooth = 1 THEN 'non smoothπ x(0, b) = x(1, b) + INT(RND * xv(b) + .25 * xv(b)): y(0, b) = y(1, b) + INT(RND * yv(b) + .25 * yv(b))π END IFπ IF smooth = 0 THEN 'smoothπ x(0, b) = x(1, b) + xv(b): y(0, b) = y(1, b) + yv(b)π END IFπ LINE (x(0, b), y(0, b))-(x(1, b), y(1, b)), bcolorπ LINE (639 - x(0, b), y(0, b))-(639 - x(1, b), y(1, b)), bcolorπ LINE (x(0, b), 479 - y(0, b))-(x(1, b), 479 - y(1, b)), bcolorπ LINE (639 - x(0, b), 479 - y(0, b))-(639 - x(1, b), 479 - y(1, b)), bcolorπ NEXT bπEND SUBππSUB wasp (wx(), wy()) STATICπ' Age the arraysπ wx(2) = wx(1): wx(1) = wx(0): wy(2) = wy(1): wy(1) = wy(0)π' Accelerate (bias random variable to ensure wasp convers entire screen)π wasp.acc = 5π wxv = wxv + INT((RND - .4) * wasp.acc)π wyv = wyv + INT((RND - .4) * wasp.acc)π' Speed limit checksπ wxv.max = INT(RND * 30) + 20: wyv.max = INT(RND * 30) + 20π IF wxv > wxv.max THEN wxv = wxv.maxπ IF wxv < -wxv.max THEN wxv = -wxv.maxπ IF wyv > wyv.max THEN wyv = wyv.maxπ IF wyv < -wyv.max THEN wyv = -wyv.maxπ' Move waspπ wx(0) = wx(1) + wxv: wy(0) = wy(1) + wyvπ' Bounce checksπ IF wx(0) < border OR wx(0) > winW - border - 1 THENπ wxv = -wxv: wx(0) = wx(0) + wxvπ END IFπ IF wy(0) < border OR wy(0) > winH - border - 1 THENπ wyv = -wyv: wy(0) = wy(0) + wyvπ END IFπEND SUBππRyan White FLYING BEES #9 BIGFOOT@SunBelt.Net 09-06-96 (12:31) QB, QBasic, PDS 142 4593 FLYBEES9.BASDECLARE SUB wasp (wx%(), wy%())πDECLARE SUB bees (wx%(), wy%(), x%(), y%(), xv%(), yv%(), bcolor%)ππ'Flybees #9π'By Ryan White Original source by Richard Daleπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net or Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππ'Just mess with it to learn. I just thought his was neat enough to maybe beπ'cooler. It was.ππDEFINT A-ZπCOMMON SHARED winW, winH, winX, winY, border, NoBees, smoothππON KEY(1) GOSUB cle: KEY(1) ONπON KEY(2) GOSUB ss: KEY(2) ONπON KEY(3) GOSUB smoothhuh: KEY(3) ONππDEFLNG T: CLSππNoBees = 1ππSCREEN 12: RANDOMIZE TIMER: CLSπGOSUB ssπDIM wx(0 TO 2), wy(0 TO 2), co(15, 2), cn(15, 2)πDIM x(0 TO 2, 1 TO NoBees): DIM y(0 TO 2, 1 TO NoBees)πDIM xv(1 TO NoBees): DIM yv(1 TO NoBees)πwinW = 0: winH = 0: winX = 0: winY = 0: maxx = 640: maxy = 480π' wasp will not go closer than this to the edgesπ border = INT(RND * 75): winW = maxx: winH = maxyπ' Initialize the waspπ wx(0) = 640 / 2: wy(0) = 480 / 2: wx(1) = wx(0): wy(1) = wy(0)π'Initialize the beesπ FOR b = 1 TO NoBeesπ x(0, b) = INT(RND * winW): x(1, b) = x(0, b)π y(0, b) = INT(RND * winH): y(1, b) = y(0, b)π xv(b) = 7 * (RND - .5): yv(b) = 7 * (RND - .5)π NEXT bπ DO UNTIL INKEY$ <> ""π CALL wasp(wx(), wy()): CALL bees(wx(), wy(), x(), y(), xv(), yv(), bcolor)π GOSUB dinπ bcolor = bcolor + 1π IF bcolor = 15 THEN bcolor = 1π LOOP: SCREEN 0πENDππcle:πCLSπRETURNππss:πrr = INT(RND * 5): gr = INT(RND * 5): br = INT(RND * 5)πFOR n = 1 TO 14πOUT &H3C8, nπOUT &H3C9, n * rr + 3πOUT &H3C9, n * gr + 3πOUT &H3C9, n * br + 3πNEXT nπRETURNππdin:πFOR n = 14 TO 1 STEP -1: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπcn(1, 0) = co(14, 0): cn(1, 1) = co(14, 1): cn(1, 2) = co(14, 2)πFOR n = 14 TO 2 STEP -1: FOR m = 0 TO 2: cn(n, m) = co(n - 1, m): NEXT m: NEXT nπFOR n = 14 TO 1 STEP -1: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπRETURNππsmoothhuh:πsmooth = smooth - 1: IF smooth = -1 THEN smooth = 1πRETURNππDEFINT TπSUB bees (wx(), wy(), x(), y(), xv(), yv(), bcolor)π' Do not let things settle downπ bb = INT(NoBees * RND + 1)π xv(bb) = xv(bb) + (RND - .5) * 3: yv(bb) = yv(bb) + (RND - .5) * 3πFOR b = 1 TO NoBeesπ' Age position arraysπ x(2, b) = x(1, b): y(2, b) = y(1, b)π x(1, b) = x(0, b): y(1, b) = y(0, b)π dx = wx(1) - x(1, b): dy = wy(1) - y(1, b)π distance = ABS(dx) + ABS(dy) ' Approximationπ IF distance = 0 THEN distance = 1π bee.acc = 3π' Accelerateπ xv(b) = xv(b) + dx * bee.acc / distanceπ yv(b) = yv(b) + dy * bee.acc / distanceπ bee.vel = 11π' Speed Checksπ IF xv(b) > bee.vel THEN xv(b) = bee.velπ IF xv(b) < -bee.vel THEN xv(b) = -bee.velπ IF yv(b) > bee.vel THEN yv(b) = bee.velπ IF yv(b) < -bee.vel THEN yv(b) = -bee.velπ' Move the beesπ IF smooth = 1 THEN 'non smoothπ x(0, b) = x(1, b) + INT(RND * xv(b) + .25 * xv(b)): y(0, b) = y(1, b) + INT(RND * yv(b) + .25 * yv(b))π END IFπ IF smooth = 0 THEN 'smoothπ x(0, b) = x(1, b) + xv(b): y(0, b) = y(1, b) + yv(b)π END IFπ FOR sx = 0 TO 639 STEP 25π LINE (x(1, b), y(0, b))-(sx, 0), bcolorπ NEXT sxπ FOR sy = 0 TO 479 STEP 25π LINE (x(1, b), y(0, b))-(639, sy), bcolorπ NEXT syπ FOR sx = 639 TO 0 STEP -25π LINE (x(1, b), y(0, b))-(sx, 479), bcolorπ NEXT sxπ FOR sy = 479 TO 0 STEP -25π LINE (x(1, b), y(0, b))-(0, sy), bcolorπ NEXT syπ NEXT bπEND SUBππSUB wasp (wx(), wy()) STATICπ' Age the arraysπ wx(2) = wx(1): wx(1) = wx(0): wy(2) = wy(1): wy(1) = wy(0)π' Accelerate (bias random variable to ensure wasp convers entire screen)π wasp.acc = 5π wxv = wxv + INT((RND - .4) * wasp.acc)π wyv = wyv + INT((RND - .4) * wasp.acc)π' Speed limit checksπ wxv.max = INT(RND * 30) + 20: wyv.max = INT(RND * 30) + 20π IF wxv > wxv.max THEN wxv = wxv.maxπ IF wxv < -wxv.max THEN wxv = -wxv.maxπ IF wyv > wyv.max THEN wyv = wyv.maxπ IF wyv < -wyv.max THEN wyv = -wyv.maxπ' Move waspπ wx(0) = wx(1) + wxv: wy(0) = wy(1) + wyvπ' Bounce checksπ IF wx(0) < border OR wx(0) > winW - border - 1 THENπ wxv = -wxv: wx(0) = wx(0) + wxvπ END IFπ IF wy(0) < border OR wy(0) > winH - border - 1 THENπ wyv = -wyv: wy(0) = wy(0) + wyvπ END IFπEND SUBππRyan White GEOMETRY SICKENER BIGFOOT@SunBelt.Net 09-06-96 (12:31) QB, QBasic, PDS 87 2422 GEOMSICK.BAS'GEOMETRY SICKENERπ'By Ryan Whiteπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net or Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππSCREEN 12πDEFINT A-ZπCLSπRANDOMIZE TIMERπpnts = 6πDIM x(pnts), y(pnts), xc(pnts), yc(pnts), xb(pnts), yb(pnts), co(15, 2), cn(15, 2)πON KEY(1) GOSUB tt: KEY(1) ON 'Change colorsπON KEY(2) GOSUB makepoints: KEY(2) ON 'redo pointsπON KEY(3) GOSUB clrdescrn: KEY(3) ON 'clear screenππGOSUB ttπGOSUB makepointsππst:πGOSUB dolineπCLSπDO UNTIL INKEY$ <> ""πGOSUB bounce: GOSUB doline: cx = cx + 1: IF cx = 5 THEN cx = 0: GOSUB colorpuller ': GOSUB doline0πLOOPπGOSUB daendππdoline:πc = c + 1: IF c = 16 THEN c = 1πm = pnts - 1: o = pntsπDO UNTIL o = 0πLINE (x(o), y(o))-(x(m), y(m)), cπm = m - 1: IF m = -1 THEN o = o - 1: m = o - 1πLOOPπRETURNππclrdescrn:πCLSπRETURNππmakepoints:πFOR n = 0 TO pntsπ x(n) = INT(RND * 640): y(n) = INT(RND * 480): xb(n) = 1: yb(n) = 1πNEXT nπRETURNππdoline0:πm = pnts - 1: o = pntsπDO UNTIL o = 0πLINE (x(o), y(o))-(x(m), y(m)), 0πm = m - 1: IF m = -1 THEN o = o - 1: m = o - 1πLOOPπRETURNππbounce:πFOR m = 0 TO pntsπIF x(m) >= 639 THEN xc(m) = 1: xb = INT(RND * 8)πIF x(m) <= 0 THEN xc(m) = 0: xb = INT(RND * 8)πIF y(m) >= 479 THEN yc(m) = 1: yb = INT(RND * 6)πIF y(m) <= 0 THEN yc(m) = 0: yb = INT(RND * 6)πIF xc(m) = 1 THEN x(m) = x(m) - xb(m) ELSE x(m) = x(m) + xb(m)πIF yc(m) = 1 THEN y(m) = y(m) - yb(m) ELSE y(m) = y(m) + yb(m)πNEXT mπRETURNππdaend:πCLS : SCREEN 0: WIDTH 80, 25: ENDππtt:πr = INT(RND * 5): g = INT(RND * 5): b = INT(RND * 5)πFOR attr% = 1 TO 15πrt% = attr% * r + 3: gt% = attr% * g + 3: bt% = attr% * b + 3πco(attr%, 0) = rt%: co(attr%, 1) = gt%: co(attr%, 2) = bt%πcn(attr%, 0) = rt%: cn(attr%, 1) = gt%: cn(attr%, 2) = bt%πOUT &H3C8, attr%: OUT &H3C9, rt%: OUT &H3C9, gt%: OUT &H3C9, bt%πNEXT attr%πRETURNππcolorpuller:πFOR n = 15 TO 1 STEP -1: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπcn(1, 0) = co(15, 0): cn(1, 1) = co(15, 1): cn(1, 2) = co(15, 2)πFOR n = 15 TO 2 STEP -1: FOR m = 0 TO 2: cn(n, m) = co(n - 1, m): NEXT m: NEXT nπFOR n = 15 TO 1 STEP -1: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπRETURNππRyan White GEOMETRY SICKER BIGFOOT@SunBelt.Net 09-06-96 (12:31) QB, QBasic, PDS 93 2582 GEOMSCKR.BAS'Geometry Sickerπ'By Ryan Whiteπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net or Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππ'This is simply a neater? version of Geometry SicknessπππSCREEN 12πDEFINT A-ZπCLSπRANDOMIZE TIMERπpnts = 3 '# or points -1πDIM x(pnts), y(pnts), xc(pnts), yc(pnts), xb(pnts), yb(pnts), co(15, 2), cn(15, 2)πON KEY(1) GOSUB tt: KEY(1) ONπON KEY(2) GOSUB makepoints: KEY(2) ONπON KEY(3) GOSUB clrdescrn: KEY(3) ONπWINDOW (0, 0)-(639, 639)πGOSUB ttπGOSUB makepointsππst:πGOSUB dolineπCLSπDO UNTIL INKEY$ <> ""πGOSUB bounce: GOSUB doline: GOSUB colorpuller ': GOSUB doline0πLOOPπGOSUB daendππdoline:πc = c + 1: IF c = 16 THEN c = 1πm = pnts - 1: o = pntsπDO UNTIL o = 0πLINE (x(o), y(o))-(x(m), y(m)), cπLINE (639 - x(o), y(o))-(639 - x(m), y(m)), cπLINE (x(o), 639 - y(o))-(x(m), 639 - y(m)), cπLINE (639 - x(o), 639 - y(o))-(639 - x(m), 639 - y(m)), cπm = m - 1: IF m = -1 THEN o = o - 1: m = o - 1πLOOPπRETURNππclrdescrn:πCLSπRETURNππmakepoints:πFOR n = 0 TO pntsπ x(n) = INT(RND * 640): y(n) = INT(RND * 640): xb(n) = 1: yb(n) = 1πNEXT nπRETURNππdoline0:πm = pnts - 1: o = pntsπDO UNTIL o = 0πLINE (x(o), y(o))-(x(m), y(m)), 0πm = m - 1: IF m = -1 THEN o = o - 1: m = o - 1πLOOPπRETURNππbounce:πFOR m = 0 TO pntsπIF x(m) >= 639 THEN xc(m) = 1: xb = INT(RND * 8)πIF x(m) <= 0 THEN xc(m) = 0: xb = INT(RND * 8)πIF y(m) >= 639 THEN yc(m) = 1: yb = INT(RND * 6)πIF y(m) <= 0 THEN yc(m) = 0: yb = INT(RND * 6)πIF xc(m) = 1 THEN x(m) = x(m) - xb(m) ELSE x(m) = x(m) + xb(m)πIF yc(m) = 1 THEN y(m) = y(m) - yb(m) ELSE y(m) = y(m) + yb(m)πNEXT mπRETURNππdaend:πCLS : SCREEN 0: WIDTH 80, 25: ENDππtt:πr = INT(RND * 5): g = INT(RND * 5): b = INT(RND * 5)πFOR attr% = 1 TO 15πrt% = attr% * r + 3: gt% = attr% * g + 3: bt% = attr% * b + 3πco(attr%, 0) = rt%: co(attr%, 1) = gt%: co(attr%, 2) = bt%πcn(attr%, 0) = rt%: cn(attr%, 1) = gt%: cn(attr%, 2) = bt%πOUT &H3C8, attr%: OUT &H3C9, rt%: OUT &H3C9, gt%: OUT &H3C9, bt%πNEXT attr%πRETURNππcolorpuller:πFOR n = 15 TO 1 STEP -1: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπcn(1, 0) = co(15, 0): cn(1, 1) = co(15, 1): cn(1, 2) = co(15, 2)πFOR n = 15 TO 2 STEP -1: FOR m = 0 TO 2: cn(n, m) = co(n - 1, m): NEXT m: NEXT nπFOR n = 15 TO 1 STEP -1: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπRETURNππNathan Wittich 3D GRAPHS wittich@cdsnet.net 09-18-96 (18:27) QB, QBasic, PDS 82 2523 3DGRAPH.BAS ' 3dgraphπ' a cool screensaver by Nathan Wittichπ' wittich@cdsnet.net in subject put in "Nathan:" someone else is inπ' an email based newsgroup that I share internet access with.π'π' This program draws new 3d graphs on the screen. Each one is differentπ' in colors, sizes, smoothness, and how high the bumps are. My goalπ' when I made it was to make each one as different as I can, not justπ' different graphs that look alikeπ'π' here's how it makes the graph:π' A dimmensioned variable (u) has all the gridsπ' Into each place, it puts a random number.π' it averages each grid's height with the heights of surrounding ones.π' It does that lots of times.π' Then it draws the graphπ'π' Although random #'s make each different, changing the source code willπ' be even better.π'π' How come in basic I can make a cooler screensaver than Microsuck?π'ππRANDOMIZE TIMERπDEFINT A-ZπDIM u(75, 60)πSCREEN 12πDOπc1 = RND * 8πc2 = RND * 8πc3 = RND * 8π'PRINT "palette"πFOR a = 1 TO 14π'PALETTE a, a * 4πNEXT aπ'PRINT "setting up"πl1 = RND * 500πl2 = l1 + RND * 500πFOR a = 1 TO 64πFOR b = 1 TO 48πu(a, b) = (u(a, b) * .9) + RND * l1 - RND * l1πIF RND < .01 THEN u(a, b) = l2 * RNDπNEXT bπNEXT aπ'FOR a = 55 TO 64π'FOR b = 5 TO 43π'u(a, b) = (u(a - 1, b) - 10)π'NEXT bπ'NEXT aπFOR i = 1 TO 4 + RND * 2πLOCATE 3, 1π'PRINT "smoothening "; INT((i / 7) * 100); "%"πFOR a = 2 TO 64 'smoothen itπFOR b = 2 TO 48πu(a, b) = (u(a + 1, b) + u(a - 1, b) + u(a, b - 1) + u(a, b + 1) + u(a, b + 2) + u(a + 2, b)) / 6πNEXT bπNEXT aπNEXT iπ'FOR i = 1 TO 2π'FOR a = -480 + RND + RND + RND TO 640 STEP 2 + RND * 3π'LINE (640 - a, 0)-(640 - a - 480, 480), 0π'LINE (a, 0)-(a + 480, 480), 0π'NEXT aπ'NEXTπCLSπ'd = 1πn = RND * 10 + RND * 10πFOR a = 60 TO 2 STEP -1πFOR b = 2 TO 45πIF ABS(a - b) < 35 AND (a + b) > 15 AND a > 5 AND b > 5 THENπ 'SWAP d, eπ 'LINE (a * n + u(a, b), b * n - u(a, b))-(a * n + u(a - 1, b + 1) - n, n + b * n - u(a - 1, b + 1)),RND * 16, BFπ LINE (a * n + u(a, b), b * n - u(a, b))-(a * n + u(a + 1, b + 1) + n, n + b * n - u(a + 1, b + 1)),c1π 'LINE (a * n + u(a, b), b * n - u(a, b + 1) + n)-(a * n + n + u(a + 1, b), b * n - u(a + 1, b)), c1π LINE (a * n + u(a, b), b * n - u(a, b))-(a * n + u(a + 1, b) + n, b * n - u(a + 1, b)), c2π LINE (a * n + u(a, b), b * n - u(a, b))-(a * n + u(a, b + 1), b * n + n - u(a, b + 1)), c3π END IFπNEXT bπSWAP d, eπNEXT aπ'a$ = INPUT$(1)πLOOP WHILE INKEY$ = ""πJames N. Broadbent DEMO OF REAL-TIME GRAPHING FidoNet QUIK_BAS Echo 05-17-96 (00:00) QB, QBasic, PDS 290 9419 GRAPHING.BAS' > I am trying to figure out a way to put some graphic onto theπ' > screen instataneously. I'm sure you have played DOOM or Wolf-3Dππ'I'm a Descent into Saturn fan myselfππ' > before, or at least looked at it. I don't know how manyπ' > frames-per-second those games display, but it is awfully smooth. Isπ' > there any way to get smooth graphics like that in QuickBASIC?ππ'I feel like taking a scene from "Wayne's World" and bowing down to these π'people saying "We're not worthy....We're not worthy!!!" :-)ππ'Truly I don't think that kind of graphics is possible in Qb 4.5. It astounds π'me how they can control the motion of robots, missles and screnery so π'smoothly. I have trouble with just a couple of simple elementsπ π' -> If it is trying to graph realtime data, I may be able toπ' -> help you. I have recently worked on a realtime graphicalπ' -> display of 2 values being updated every 0.2 seconds usingπ' -> PSET, VIEW, and WINDOW.ππ' > Do you have any code that you might be able to post in here?ππ'Sure!...<...>ππ'The purpose of this routine is to give a graphic visual display of incoming π'data from 2 COM ports. I have simulated this a simple random number routine π'for each variable.π π'It probably could be improved a bit since I don't put the values for the majorπ'Y-axis tick marks. But they aren't really necessary for what I was doing.π π'Hope you like it....look forward to your comments.π π'Regards Jimππ' **************************************************************π' *** Demonstration of real-time graphing of 2 parameters ***π' *** with time on the X-axis ***π' *** ***π' *** by James N. Broadbent ***π' *** May 17, 1996 ***π' **************************************************************ππSCREEN 12πDIM YGRAPH!(8, 2)ππ' YGRAPH!(8,2) is the matrix that holds the vales that make upπ' the Y-axis for the 3 "ZOOM" levels.π' "ZOOM" levels are magnification levels of full scale on theπ' Y-axis. They can be any ratio desired but in thisπ' example the ZOOMFACTORS are 100%, 200% and 400%π' magnification.ππ' NOTE: This is not a general graphing routine but will haveπ' a min "Y" value set to 0.0 and max "Y" value of 100000πSTART:π CLSπ LOCATE 9, 20π LINE INPUT "Enter the Maximum Value for Y-axis: "; a$π IF VAL(a$) <= 0! OR VAL(a$) > 100000 THENπ LOCATE 11, 20π BEEPπ PRINT "Please enter a number from 0 to 100,000!"π SLEEP 1π GOTO STARTπ END IFπ MAXY! = VAL(a$)ππ' Graph co-ordinates for ZOOM feature and drawing the Y-axisππ' set min and max for window statement for each zoom levelπ YGRAPH!(0, 0) = MAXY! * 1.05π YGRAPH!(0, 1) = MAXY! * 1.05 / 2π YGRAPH!(0, 2) = MAXY! * 1.05 / 4π YGRAPH!(1, 0) = -.05 * MAXY!π YGRAPH!(1, 1) = -.05 * MAXY! / 2π YGRAPH!(1, 2) = -.05 * MAXY! / 4π π' set Y-axis and X-axis overall coordinatesπ FOR i% = 0 TO 2π YGRAPH!(2, i%) = YGRAPH!(1, i%) * .95π NEXT i%π π' set major Y-axis tick marksπ k! = 1.25π FOR j% = 3 TO 7π k! = k! - .25π FOR i% = 0 TO 2π l% = i% ^ 2 + 1π IF l% = 5 THEN l% = 4π YGRAPH!(j%, i%) = MAXY! * k! / l%π NEXT i%π NEXT j%ππ' Bottom screen clearing coordinatesπ YGRAPH!(8, 0) = -.045 * MAXY!π YGRAPH!(8, 1) = -.045 * MAXY! / 2π YGRAPH!(8, 2) = -.045 * MAXY! / 4ππ' Create the viewport for the Graphπ VIEW (1, 100)-(637, 440), 1, 9ππ' set up the initial graphπ z% = 0 ' ZOOMFACTOR elementπ GOSUB graphcoordinatesπ COLOR 14π LOCATE 1, 10π PRINT "Demonstration of a Continuous Real-Time Plot of 2 Variables";π LOCATE 2, 30π PRINT "by James N. Broadbent"π ZF% = z% ^ 2 + 100π IF ZF% > 450 THEN ZF% = 400π r! = MAXY! / ZF% * 100π COLOR 11π LOCATE 4, 5π PRINT "Y - Axis Range : 0 to"; r!; " units"π COLOR 3π LOCATE 5, 5π PRINT "ZOOM Factor (%):"; ZF%π COLOR 13π LOCATE 4, 50π PRINT "Value of Variable #1:";π COLOR 15π LOCATE 5, 50π PRINT "Value of Variable #2:";π LOCATE 29, 5π PRINT "Press <X> to Exit";π LOCATE 29, 57π PRINT "Press <Z> to ZOOM";π COLOR 14π LOCATE 29, 34π PRINT "TIME (SECS):";ππ' initialize these following parameters for real-time graphπ X! = -1 ' X axis data positionπ STARTTIME! = TIMER ' for time display = 0π TRIGGER! = TIMER ' to trigger data displayπ π' Generate simulated values and plot to the screenππ DOπ a$ = UCASE$(INKEY$)π IF TIMER - TRIGGER! > .2 THENπ GOSUB YDATAπ TRIGGER! = TIMERπ COLOR 14π LOCATE 29, 46π PRINT INT(TIMER - STARTTIME);π IF TIMER - STARTIME > 99999 THEN STARTIME = TIMERπ END IFπ IF a$ = "Z" THENπ z% = z% + 1π SELECT CASE z%π CASE 0π ZF% = 100π CASE 1π ZF% = 200π CASE 2π ZF% = 400π CASE 3π ZF% = 100π z% = 0π END SELECTππ r! = MAXY! / ZF% * 100π COLOR 11π LOCATE 4, 5π PRINT SPC(35);π LOCATE 4, 5π PRINT "Y - Axis Range : 0 to"; r!; " units";π VIEW (1, 100)-(637, 440), 1, 9π GOSUB graphcoordinatesπ COLOR 3π LOCATE 5, 22π COLOR 13π PRINT ZF%; ' Display the ZOOMπ END IFππ LOOP WHILE a$ <> "X"ππ VIEWπ CLS 0π COLOR 15π LOCATE 9, 29π PRINT "Start again (Y/N)?"π DOπ a$ = UCASE$(INKEY$)π IF a$ = "Y" THEN GOTO STARTπ IF a$ = "N" THEN ENDπ LOOPππgraphcoordinates:ππ' Set up Graph coordinatesππ WINDOW (-15, YGRAPH!(1, z%))-(620, YGRAPH!(0, z%))π LINE (-8, YGRAPH!(2, z%))-(600, YGRAPH!(2, z%)), 11π LINE (-5, YGRAPH!(3, z%))-(-5, YGRAPH!(1, z%)), 11π LINE (-10, YGRAPH!(3, z%))-(-5, YGRAPH!(3, z%)), 11π LINE (-7, YGRAPH!(4, z%))-(-5, YGRAPH!(4, z%)), 11π LINE (-10, YGRAPH!(5, z%))-(-5, YGRAPH!(5, z%)), 11π LINE (-7, YGRAPH!(6, z%))-(-5, YGRAPH!(6, z%)), 11ππ' Next line is the "TICK" indicating ZEROπ LINE (-10, YGRAPH!(7, z%))-(-5, YGRAPH!(7, z%)), 13ππ RETURNππYDATA:ππ' Generate simulated vales for variables 1 and 2ππ IY1! = (MAXY! * RND(1) - MAXY! / 2) * .1π IY2! = (MAXY! * RND(1) - MAXY! / 2) * .1π IF Y1! + IY1! > MAXY! OR Y1! + IY1! < 0 THENπ Y1! = Y1! - IY1!π ELSEπ Y1! = Y1! + IY1!π END IFπ IF Y2! + IY2! > MAXY! OR Y2! + IY2! < 0 THENπ Y2! = Y2! - IY2!π ELSEπ Y2! = Y2! + IY2!π END IFπ LOCATE 4, 72π PRINT " ";π LOCATE 5, 72π PRINT " ";π SELECT CASE MAXY!π CASE IS > 10000π COLOR 13π LOCATE 4, 72π PRINT USING "#####"; Y1!π COLOR 15π LOCATE 5, 72π PRINT USING "#####"; Y2!π CASE 1000 TO 9999π COLOR 13π LOCATE 4, 72π PRINT USING "####.#"; Y1!π COLOR 15π LOCATE 5, 72π PRINT USING "######.#"; Y2!π CASE 100 TO 999π COLOR 13π LOCATE 4, 72π PRINT USING "###.##"; Y1!π COLOR 15π LOCATE 5, 72π PRINT USING "###.##"; Y2!π CASE 10 TO 99π COLOR 13π LOCATE 4, 72π PRINT USING "##.###"; Y1!π COLOR 15π LOCATE 5, 72π PRINT USING "##.###"; Y2!π CASE 1! TO 9.9π COLOR 13π LOCATE 4, 72π PRINT USING "#.####"; Y1!π COLOR 15π LOCATE 5, 72π PRINT USING "#.####"; Y2!π END SELECTπ X! = X! + 1π π' plotting the variable values π IF X! > 600 THENπ X! = 0π PSET (X!, Y1!), 13π PSET (X!, Y2!), 15π ELSEπ LINE (X! - 1, LY1!)-(X!, Y1!), 13π LINE (X! - 1, LY2!)-(X!, Y2!), 15π END IFπ π' compute and establish data clearing block π π IF X! > 559 THENπ XL! = X! - 560π ELSEπ XL! = X! + 41π END IFπ LINE (XL! - 1, YGRAPH!(8, z%))-(XL! + 1, YGRAPH!(0, z%)), 1, BFπ π' save last values of each variable π LY1! = Y1!: LY2! = Y2!π RETURNπRyan White SPIRALING MIND KNOCKER BIGFOOT@InfoAve.Net 09-21-96 (17:53) QB, QBasic, PDS 74 2707 SPIRALER.BAS'sPiRaLiNg MiNd KnOcKeR 1π'By Ryan Whiteπ'Look at it for a while then look awayπ'Edit anyway you wantππON KEY(1) GOSUB st: KEY(1) ONπSCREEN 13πCLSππ 'rozeπ'FOR x = 180 TO 1 STEP -.5π'z = 159 + x * COS(x):y = 99 + x * SIN(x)π'FOR r = 15 TO 0 STEP -1π'c = c + 1: IF c = 16 THEN c = 1π'LINE (z - r, y - r)-(z + r, y + r), c, Bπ'NEXT r: NEXT xππ 'Webzπ'FOR x = 180 TO 1 STEP -.05π'z = 159 + x * COS(x): y = 99 + x * SIN(x)π'c = c + 1: IF c = 16 THEN c = 1π'LINE (0, 0)-(z, y), c: LINE -(319, 0), c: LINE (319, 199)-(z, y), c: LINE -(0, 199), cπ'NEXT xπ π 'Gemzπ'FOR x = 180 TO 1 STEP -.05π'z = 159 + x * COS(x): y = 99 + x * SIN(x)π'FOR r = 5 TO 1 STEP -1π'c = c + 1: IF c = 16 THEN c = 1π'FOR m = -1 TO 1: CIRCLE (z, y + m), r, c, , , 1: NEXT mπ'NEXT r: NEXT xππ 'X-pointsπFOR x = 180 TO 1 STEP -.05πz = 159 + x * COS(x)πy = 99 + x * SIN(x)πc = c + .1: IF c = 16 THEN c = 1πLINE (z - 2, y - 2)-(z, y), cπLINE -(z + 2, y - 2), cπLINE (z + 2, y + 2)-(z, y), cπLINE -(z - 2, y + 2), cπNEXT xππst:πDEFINT A-ZπDIM c(255, 2), co(255, 2)πFOR n = 0 TO 15π'black white red orange yellow green blue's purple ~then backwards~πc(n, 0) = n * 4: c(n, 1) = n * 4: c(n, 2) = n * 4πc(n + 16, 0) = 63: c(n + 16, 1) = 63 - n * 4: c(n + 16, 2) = 63 - n * 4πc(n + 32, 0) = 63: c(n + 32, 1) = n * 2: c(n + 32, 2) = 0πc(n + 48, 0) = 63: c(n + 48, 1) = n * 2 + 31: c(n + 48, 2) = 0πc(n + 64, 0) = 63 - n * 4: c(n + 64, 1) = 63: c(n + 64, 2) = 0πc(n + 80, 0) = 0: c(n + 80, 1) = 63 - n * 2: c(n + 80, 2) = n * 4πc(n + 96, 0) = 0: c(n + 96, 1) = 32 - n * 2: c(n + 96, 2) = 60πc(n + 112, 0) = n * 3: c(n + 112, 1) = 0: c(n + 112, 2) = 60πc(n + 128, 0) = 45 - n * 3: c(n + 128, 1) = 0: c(n + 128, 2) = 60πc(n + 144, 0) = 0: c(n + 144, 1) = n * 2: c(n + 144, 2) = 60πc(n + 160, 0) = 0: c(n + 160, 1) = 30 + n * 2: c(n + 160, 2) = 60 - n * 4πc(n + 176, 0) = n * 4: c(n + 176, 1) = 63: c(n + 176, 2) = 0πc(n + 192, 0) = 63: c(n + 192, 1) = 60 - n * 2: c(n + 192, 2) = 0πc(n + 208, 0) = 63: c(n + 208, 1) = 30 - n * 2: c(n + 208, 2) = 0πc(n + 224, 0) = 60 - n * 2: c(n + 224, 1) = n * 2: c(n + 224, 2) = n * 2πc(n + 240, 0) = 30 - n * 2: c(n + 240, 1) = 30 - n * 2: c(n + 240, 2) = 30 - n * 2πNEXT nπ'makes the colors appearπFOR n = 0 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nππDO UNTIL INKEY$ <> ""πFOR n = 1 TO 255: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπc(255, 0) = co(1, 0): c(255, 1) = co(1, 1): c(255, 2) = co(1, 2)πFOR n = 1 TO 254: FOR m = 0 TO 2: c(n, m) = co(n + 1, m): NEXT m: NEXT nπFOR n = 1 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nπLOOPπRyan White MULTI MORPH BIGFOOT@InfoAve.Net 09-21-96 (17:53) QB, QBasic, PDS 89 2580 4XMORPH.BAS 'MultiMorphπ'By Ryan Whiteπ'Feel free to change, to love, to marriage. NO COMPUTER SEX THOUGH!!!!π'I MADE THIS PROGRAM TO EDIT AND ENJOY, BUT NOT TO HAVE SEX WITH!!!!π'I'm SeRiOuS!ππSCREEN 13πCLSπRANDOMIZE TIMERπDEFINT A-ZπDIM cn(255, 2), co(255, 2)πVIEW (0, 0)-(319, 199)πFOR x = 0 TO 63πOUT &H3C8, x: OUT &H3C9, x: OUT &H3C9, 0: OUT &H3C9, 0πOUT &H3C8, x + 64: OUT &H3C9, 0: OUT &H3C9, x: OUT &H3C9, 0πOUT &H3C8, x + 128: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, xπOUT &H3C8, x + 192: OUT &H3C9, 63 - x: OUT &H3C9, 63 - x: OUT &H3C9, 0πNEXT xππc = 0πFOR x = 0 TO 289 STEP 20: x2 = x + 20πFOR y = 0 TO 189 STEP 10: y2 = y + 10πFOR pnty = y TO y2πc = c + 1: IF c >= 64 THEN c = 0πLINE (x, pnty)-(x2, pnty), cπNEXT pntyπNEXT yπNEXT xππc = 64πFOR n = 1 TO 10πx = INT(RND * 280) + 20πy = INT(RND * 160) + 20πr = INT(RND * 20) + 10πFOR m = 1 TO rπc = c + 1: IF c >= 64 THEN c = 0πFOR o = -1 TO 1πCIRCLE (x, y + o), m, 127 - c, , , 1πNEXT oπNEXT mπNEXT nππc = 128ππFOR n = 1 TO 10πx = INT(RND * 299) + 1πy = INT(RND * 179) + 1πFOR r = 0 TO 20πc = c + 1: IF c >= 192 THEN c = 129πLINE (x - r, y - r)-(x + r, y + r), c, BπNEXT rπNEXT nππc = 255 'we are going in reverse this timeπx = 160: y = 100πFOR m = 1 TO 3500πPSET (x, y + 1), cπPSET (x, y), cπPSET (x, y - 1), cπPSET (x + 1, y + 1), cπPSET (x + 1, y), cπPSET (x + 1, y - 1), cπPSET (x - 1, y + 1), cπPSET (x - 1, y), cπPSET (x - 1, y - 1), cπc = c - 1: IF c <= 191 THEN c = 255πx = x + (INT((RND * 2) + 1) * 2 - 3)πy = y + (INT((RND * 2) + 1) * 2 - 3)πNEXT mππDO UNTIL INKEY$ <> ""π'read color valuesπFOR n = 0 TO 255: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπ'cycle last from first colorπcn(63, 0) = co(1, 0): cn(63, 1) = co(1, 1): cn(63, 2) = co(1, 2)πcn(127, 0) = co(64, 0): cn(127, 1) = co(64, 1): cn(127, 2) = co(64, 2)πcn(191, 0) = co(128, 0): cn(191, 1) = co(128, 1): cn(191, 2) = co(128, 2)πcn(255, 0) = co(192, 0): cn(255, 1) = co(192, 1): cn(255, 2) = co(192, 2)π'cycle the rest 170 length -==>πFOR n = 0 TO 62: FOR m = 0 TO 2πIF n <> 0 THEN cn(n, m) = co(n + 1, m) 'red not ok I have to limit it to 63 colors becauseπIF n = 0 THEN cn(1, m) = co(n + 1, m) 'if 0 is messed with, then the border of the monitor goes *ukie*πcn(n + 64, m) = co(n + 65, m) 'green okπcn(n + 128, m) = co(n + 129, m) 'blue okπcn(n + 192, m) = co(n + 193, m) 'yellow okπNEXT m: NEXT nπ'write color to screenπFOR n = 0 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπLOOPπPhillip Jay Cohen OUTLINED FONTS cohennet@erols.com 09-29-96 (11:47) QB, QBasic, PDS 128 6434 FONTS.BAS π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'''' Phillip Jay Cohen's Outlined Font Routines: ''''π'''' Demo Program ''''π'''' ''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''ππ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'''' Everything appearing here in the main program is just demonstration ''''π'''' and won't be of any use to any of you (or at least I don't think so) ''''π'''' Besides, it's not hard to understand what's going on here, it's the ''''π'''' actual routines that do most of the work. These are just calls, and ''''π'''' a pretty border to keep us happy. If you want to use these routines ''''π'''' you will somewhat need to understand how to call them. Just run the ''''π'''' program to find out about the syntax and stuff, or if you are lazy, ''''π'''' you can check directly in the code, but then you won't know how it ''''π'''' looks. The routines will only work in screen mode 13, as I am use- ''''π'''' ing VGA video memory. I will be very happy if you distribute these ''''π'''' routines, and if you think they're useful or maybe you feel warm and ''''π'''' squooshy inside, then please E-mail me and tell me. My email is: ''''π'''' cohennet@erols.com. Thanks for taking time to read this. -- P.J.C. ''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''ππDEFINT A-Z 'Not neccessary, but it couldn't hurt to speed things up a bitππDECLARE SUB OFont (Text$, X, Y, Fore, Back) 'Main font routineπDECLARE SUB OCenter (Text$, Y, Fore, Back) 'Centering routineπDECLARE SUB PressAndClear () 'Waits for key pressππSCREEN 13 '320x200 VGA and MCGA screen modeππ 'None of the rest is important, it's just demonstrationπLINE (1, 0)-(318, 0), 4πLINE (0, 1)-(0, 198), 4πLINE (1, 199)-(318, 199), 4πLINE (319, 1)-(319, 198), 4πLINE (1, 1)-(318, 198), 41, BπLINE (2, 2)-(317, 197), 42, BπLINE (3, 3)-(316, 196), 14, BπPAINT (4, 4), 25, 14πOCenter "PHILLIP JAY COHEN'S", 10, 2, 144πOFont "OUTLINED FONT", 60, 25, 43, 114πOFont "DEMO PROGRAM", 180, 25, 32, 1πOCenter "Syntax:", 50, 15, 8πOCenter "OFont Text$, X, Y, Fore, Back", 65, 40, 4πOFont "Where:", 10, 85, 9, 33πOFont "Text$ = The text to be printed", 70, 85, 11, 3πOCenter "X = The horizontal coordinate for the", 100, 35, 5πOCenter "upper-left hand corner of the text", 110, 35, 5πOFont "Y = The vertical coordinate for the", 10, 125, 42, 41πOCenter "upper-left hand corner of the text", 135, 42, 41πOCenter "Fore = The text's foreground color", 150, 13, 37πOCenter "Back = The text's background color", 165, 44, 6πOCenter "PRESS A KEY", 185, 15, 8πPressAndClearπOCenter "Also Including", 50, 15, 8πOFont "A centering routine,", 25, 65, 40, 4πOFont "which has the", 190, 65, 11, 3πOCenter "same syntax, except for the X argument", 75, 11, 3πOCenter "These routines only work in screen", 90, 35, 5πOCenter "mode 13, but have many advantages,", 100, 35, 5πOCenter "Including:", 115, 44, 6πOCenter "Outlining (obviously), placement at", 130, 42, 41πOCenter "exact coordinates (unlike PRINT),", 140, 42, 41πOCenter "avoid erasing the background, and", 150, 42, 41πOCenter "are relatively FAST for QBasic", 160, 42, 41πOCenter "MORE -->", 173, 13, 37πPressAndClearπOCenter "Please,", 50, 15, 8πOCenter "Feel free to distribute these routines", 65, 40, 4πOCenter "Try to give me credit when you use", 80, 11, 3πOCenter "them, if you can (I don't think that's", 90, 11, 3πOCenter "asking too much, do you?)", 100, 11, 3πOCenter "Unless you have a lot of programing", 115, 9, 33πOCenter "experience, don't try to understand", 125, 9, 33πOCenter "the OFont routine; you don't need to", 135, 9, 33πOCenter "know how the routine works to use it", 145, 9, 33πOCenter "For more info, you can contact me at:", 160, 35, 5πOCenter "cohennet@erols.com", 173, 44, 6πPressAndClearπSCREEN 0πWIDTH 80πENDππSUB OCenter (Text$, Y, Fore, Back)πOFont Text$, 160 - INT(LEN(Text$) * 4), Y, Fore, Back 'Call with appropriateπEND SUB 'Starting X coordinateππSUB OFont (Text$, X, Y, Fore, Back)πDEF SEG = &HFFA6 'Stores masks for lettersπFOR Letter = 1 TO LEN(Text$) 'Does each letterπAddress = (8 * ASC(MID$(Text$, Letter))) + 14 'Address for start of letterπFOR Height = 0 TO 7 'Each letter is an 8x8 pixel matrixπMask = PEEK(Address + Height) * 128 'Address for mask of each line of letterπLINE (X + Curntx + 1, Y + Height + 1)-(X + 9 + Curntx, Y + Height + 1), Fore, , MaskπNEXTπCurntx = Curntx + 8 'Advances X axis by 8 for next letterπNEXT 'Continue to next letterπDEF SEG = &HA000 'Change to video memoryπIF Back > 0 THEN 'Background color can't be color 0πFOR V = Y TO Y + 7 'Again, they're 8x8 pixelsπFOR H = X TO (LEN(Text$) * 8) - 1 + X 'Calculates length of text in pixelsπPK0& = PEEK(H + V * 320&) 'Is point at H,V = to foreground color?πPK1& = PEEK(H + 1 + (V + 1) * 320&) 'Is point at H+1, V+1 = to foreground?πPK2& = PEEK(H + 1 + V * 320&) 'Is point at H+1, V = to foreground?πPT& = H + V * 320& 'Video memory pointerπIF PK0& <> Fore THEN 'If this is foreground, don't overlap itπIF PK1& = Fore OR PK2& = Fore THEN POKE PT&, Back 'Put pixel into memoryπEND IFπNEXT H 'Next horizontalπNEXT V 'Next verticalπEND IFπDEF SEG 'Put us back whereπEND SUB 'We startedππSUB PressAndClearπBuffer = &H1AπDEF SEG = &H40πPOKE Buffer, PEEK(Buffer + 2) 'Clear keyboard bufferπDEF SEGπDO: LOOP WHILE INKEY$ = "" 'Wait for key pressπLINE (4, 45)-(315, 180), 25, BF 'Clear our working areaπEND SUBππRyan White MISCELLANEOUS GRAPHIC PROGRAMS BigFoot@InfoAve.Net 09-21-96 (00:00) QB, QBasic, PDS 617 40662 BIGFOOT.BAS DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"BIGFOOT.ZIP",4^6:Z&=30250:?STRING$(50,177);πU"%up()%9%%%#-%*7[\F$g/UT/)%%%-1%%%6%I%%C4)<?TXM3<=C2<>ASh10B&h%*πU">Se'5M0H]xUxA%#MUrs?T=A9Gv2'9/&)k=4j018;Q#<)&QS?)87X-$q'.<B=,jOπU"oGD5Z7r_AeKc(j>7FZ[gqQgt^fsO$JlE[foW+;9GRtbKBkD;0a=hZYJ^AuJXC9PπU"tgDJGlPz0)8?)]Xb\'If&A%(\Srfa#Y\Ll*t(UPR4t1Qsj47[tD88U$n?]ZU(^cπU"^87_QhbsM/]6wG<DH'DB&=\c;.loo6z]NC%;y[JICR?,Zsh2$gb=up*(Q9??\'DπU"Cas+;*qeiV;y*q46B?BJeYU(2E:H1:(d?vDXm]_mr<Y#WDuuOylK.Io$APsn=3$πU"oRZEu9j>UT,w36xfZo*Y<Nq(xJK<DyK#Ct0,&-99>('Wu:yqjZeCVGS'dGEi&gqπU"-UpI]9PHd.t,Et/Sv.S%Q1A.$Pn.<lxvxCiEk)O1-',(=BYupT8(fu2]_i<?s8BπU"C)0>>Uuwe9hMRUHpQ:'',Pq_&%j$mXb1uPU&Itn8bV1u8qhhs*(rTI?->ODw$Y-πU"+JKLnzygdbw99jRXLjX[jMZV?\eXnlf1r=lg-N^Vu]:)RXA+UYwC+f'_A1tb<$9πU"Z>32QOO<wg#pCa/E&S=r4j1PE/Sikll7d0?7_7:u%3\]9J/1?tu?7-_0)Xk]-o&πU"ZzSdcR5/If]sHU-#f:UB%.l-Lb6R%GGi4<b(b5d?N:W+9p7;I\cU&9(qNhxjxC0πU"IC(uNS8wu4/&A:Pb2Qyq8,:.SU\LcKW<x\8h>lrP;5mR2vMqQ,WZ#VjHuS=Uf2'πU"W65=.ZDJ(&D6K\p&^9o3;Jk0Vu&?r*2ovVCFXCv86rB5:$\-Km*4O^dcgRr]5PCπU"$4)l+-qj=lJ7f<NFq\oF[JA/Omj%9;A9lgm\XiUxC,Z4Kr/;h+jQdhc9#Ar+z]tπU"a%,fI+sGU2IKmJV_S#o.PU%jB%2cF,i2xn_Hs9.hT')_o[P.+(7URJ\^^xu(+5BπU"f=+Nukf6'I#QM][/U36KtTq,tU<[uByYJZ7,qqy*iQed^j;U7vfR]dlIo707tN5πU"XVciGHT?DIvLu=P5q<ceY?gx5io-I0ft16N_$o]0eK(Hj8=Ej7f;$s\)^Q4$f/=πU"i7:$C)c3MMcM/g4Q0eq=S7SZIC'/y63,&/QM5g>x1#RZ,K8k6A#/))HLP.oHXK.πU"Yw24I$0_I:l'PFH#CQsb3*wBs2c-Q<4Fy47>Dh:zAMk;Uf.Te),W:F?GQX.8J30πU".2ELL.4Dmd[Y-1JkpO(h0&#SI*I/rtK8bic*=jxs2.kD_O+q(RSnYqG/c=EwJlSπU"r+_ju+Agr%;+PK,-;-OD*YQjK-m*9ahFmyWpPtv9U(p7^I-%/UQ(oLO))I1pzO3πU";]p-Mei>VtAEojc#<./p4mnM3;BdWUpA8AQ#Qp6r2:eI<0vGnsy8;6CxnV>om4XπU"aEjGgr,yu%u%p()9%%%%-.%/2[aF.g2(OD(%%%m.%%%5%%L%C4<A?TYGM<>A?J7πU"S10DB\z*,>So58Ml[dM[yyg<Me5pA?UO$cSMvJ\p5Jm0skk2n'&hJoSni8QhEILπU"ATKJ$Ra$phq>5p_][_-_o9+VGl>euT0rA+so$pqafukIss:;Q[$<p25&>hM0?3TπU"rcg2MO^?SYoB5:9K#bghHxDA#2J_gO0DU*GaD$j<.h'71Sk=[e#utkuoBM<miEoπU"iC5Ls<Mp(#=XcIpN'LP>p.H#F?W%k,%AHQ$E1CuV+a8=gLs]-,i<lc0UQRPWYg9πU"mLHjQ#Dre:9K%u2w2e$)km^>.x9\YLQ6MEGC7MIr=Dufmljt)B)EuQ5jUA5LHs%πU"OWOVuWVm7#7jZXNLJ_b(4/h%Y4AHiFCMaVb9;xZ*'$nBZ)0Bitua%1F/-N[ur0FπU":T9S:u'N8M%h;7naLH+#2GILV0DpssInQ;V?LBH5bqI+sD2uO8T7$l\JZO#/;WKπU"&uqkGCfYoG,Q%t3y.<1J-C4A(yE-?v7G*E&v2fqFkI+o^JN6;CUtpK:NG^Cf9i$πU"PJ;)7w'OWbYP5>5o=bu2XOC8(J_k$e$<S)>[n5VW0\9/Om%zjV/(ob$^RwjrS6EπU"0\xhk#S;2xw$gP4$.TckHLcke^c5bsRTm4MC\%ZBthdFQ;2*S2&<)U*t^9i4sX^πU"IRzb)>uZO:3O>Ql^CUlLj.i0dRK]eV\>3Dlm7za$5t0Xw:L9KtMa96Qk(>p3zT]πU"3EUG1R*U2KOq0#[YrVPrVF4b:/vdUa?/r[mcm;QUX/Q'aj9gdUN:Ls_?M**Zc*^πU"2a(7v;n&Z6^+E<4:fLz+-#'bFeSrg%^;I$RL7Uczj(k\H:uW;^H9bxiv^WA6.;4πU"m99'A-<=&EslO,Qr5CtF*%S/7Z&(0WAdb-9361bTQ[U<F</G-/v#?KGbl;;pC>\πU"MufYA>5S4:+.SS0Hj)lP#aHYqU#fQx_[4%xQ$%mU'VS<-ZOw9NsrjhJ1^J?P;ENπU"2G[9pnF^F$cAI]JbOZHWhia;/o$MHVQy&W%Z4dBcsM_Zps-bV#c[7$'tmY-]jF7πU"jL3z*2MWj&35pXu3uI:J3IzKM#rYU\>s1XU?cV[/dYQwxd20NIZ-A=EpPn.FH:=πU"dzdM:54*):nmX.6-/Drr0%bJE0Ij3P:/V'+Jq'x&up%()9%%%%-%%)q]Fpi^P*'πU"u*%%&s<%%%6%%%MC4<?ITg;3M?825JGS10PB^'<+tTm5]wCNxq0c;Z'-sST%eNOπU"y/P=WS]=v7'rPM,juOjN*u2.L?QusjLhZ.p-E[sxZsu5tecGea,l,\(h8ljO<u[πU"9M4R*P9vE^RD)U3pfIG<hQP_(1*i>Mb>)W-BlI[_[;?'qh8,B(n9PFj<ZYj6#Z2πU"7a.w32bEj.^tr;E'6MK9(cHc&pTQDJ4jh;c6q,L[PgdWq_Ocp;7ZQJ7_Wf)1.r5πU"$=6NM:hE\Kag7>U8^:(f=F$n+T)?uTI4/8)inuB'OMN:CxGBSccjAH^cH=:K4J)πU"7TFo+GMng9c+wB3+NigN#*ptnzZwIJViC'&H&z2n&Ze+p[CZ,*cBao_=$z+F/8UπU"L00P6l1,:vUOR3tSX)jKrOJ(orchOVr;S9gfE,=b6A&,L[nF0lw2(*nn&TtB7)cπU"Dw7sy9/80'e(5EW0u9?;cJZQE(?;a-U\68Rh^C*R3C7OrZs<ZTF-<lN_S-(\lsxπU"Z)KojjQMqq*1-$D,[#*4S5BAV+xHne2iztxUops?Y/F#ULVd18/soo5Jn4:$hEvπU"#mph0=.u]\j#-ni]u?wY4Tp$KH8;f/Or+agwt;>2.5qyf_;JSM5J'42Z6prp4:\πU"']evXFV/;<J1LTfE>;Y.)_O?s5%PESj*uEfNdN&6<_gpD<i]01Yh91bMLa_OoDoπU",X'd.X-jP'[)9piRkCQVrr;g;wK02oj0;_=60)\Tj^^Od(DoJ1r+0OabPP<L'&+πU">8Vlv)n'>B=Pv'6\_Sthd3rH'6n8M096kC7XI()qK1^nD)NOYND.dMALJq9oG^PπU"AOl]ZGLGh=4.CAt.>#bF<D4[J/EViQ>/IsMdGVJEt#M%P1A5]HO\#0]o;DJ2h6lπU"JOPxP_Y=H/&T)7?^Vf)fXc:6c'=q/=0[Ygg_+q>0HS3?Wd:J3hlI&\0EBJ\rBgFπU"PUAa9)2BFKp>FpkZrqrlICFVYKPWdP=^Q7(%B4r]/kwGZ4Tb3Zq*.6]1&TZZ)PEπU"Go./8(c?rWA2F;ix*1hQkV2knV$j0,Z#+Y/*0ua4f#NFymg3ug$X9N[0OSm5#0gπU"B;Xs5<8N7:3Cq:iIUa.FJ*oVjj#Tg[fe.K2><[2s_aRttFG\UgjffH.R><(4lpjπU"8p-3zLE&'D[gP[i-:C.LbkH1-i)rzxYIfv7611QHQem?.6G#B[8^.*5i*L:R2/vπU"*+b^;6<(yT;[h[Od#Q%_\eZ=pR[^[eg&t%dmm%9?_<fZLgD97j%F9UY8W$?2^EoπU"[8&\[m(>ufw:-/T*?:DJuXeER?xCZSDq5n%n'bq7dfe*>:K?NlM:q#M1U0L/NbgπU"1DF]fiipM8>VqG8P$(%58e2K(;%Epu6?OipQ\DOAsmb:t0e-(8Q/6xN?07^C#tUπU"N(V2K=mtsSLUuk'f*($^BphhwRZ^Tlop_ed5f?4'-\3jn,t*?%W<uaqqxOVkh9_πU"M(T>>;HTPW.B:&va]TO*JaQ;DPgG\TAY0Cci>,$>6Q().Kj>=)=.22o6AvxOXF>πU".dMA4d_Dj%gKnU%7(R7Oi%Q>MrdOurA6f,qQb]]:YSeG&7AD;s5m?#I'NPzREOJπU"HmsvK:A-/R:(k>XT5<J#IOE#:qGO7]g1Wg]EzF:pV&/;]jS#hYz5pq_zZ'fDZT<πU"UaA>QE?b&]X'A=WHDebXSkN[_p[AyfRI$kwYcQrY$1+6A[#[,hm5.0yAsT3l&a)πU"I0jDia/.ECj5mG4;Kmse8Lb.CMH=^*Gz.jGo0>_Z?4:RF7qSUB1JG=Ngi3#8t(_πU")J3MU[uC=grd?-nH#ieVBF(^D]t:e_ngY,1f8o]Z7GYFVgYf2a1td29WP%Cdf^=πU"i_%=ch%Ot$+#ELIw]XNW/m<w\hVrhc%Vj;R(EgRft+g;H1rt$v/-T&^4L9rGHwVπU"j0*5)-^c?0)=,#$,YHq[AD;Lq'1P9:Ya3tW4h5IiOjXK'oa\8PtfNGjXB;]'8upπU"(%)9%%[%-%?#p]F0NhXwY#-%%n%<%%6#%%%C24<?T1l85WM1B0ELS10BW>'t>][πU"m7wUBXxpB=j8gdFQ_E(qQK^Ej?7C(1?eS3B8DwR(B)12;3jIWe.8.tDtJ_r*F3vπU"b0&M*i4zydQjNrBYIP6<V\jxydqj_H>l//Y0S/fC_fEMjXbifTff/Vg0e<Aa(VfπU"cr009GP6b2aaDf;\c97P</'vBtcp,uBKU37fJp0.%a6Vl.(5Ae&n/Q[zo\tgXH_πU"LbcQn7P>+agmMe9)qZwnS&6\=\Rq.RO5NCo0ph6KE0KIme0aj\1$WYeRb)B5d$>πU"n<1BOJbgrw3ocPUqJ=%$Ant-R-ae5nF8ZH4I,5Zk]iGe%)U/cI(pu>I85rI-f$RπU"TlLRrm'SZ'-oQ4uGp+R)r^ZT$pAgLQ41u^--.DF5Z/?JJTGZADRP\['=7I-OTM8πU"6RRuRT%OF<,.Gg[=-oG5m+^0Zn'W5)47(a:/4c_])]kh7u47+/b6mN4^jI(ju<<πU"hPZS8%TfKxXhnGSufWGkFk&2Sdg9b+/,3xH)TYeA]o&t,:g6#l-.hQ%*kjeZvZ>πU"-S,JlT3#_gY4#;'p[UDmiwZ_t,6*(A/8FUgA'w&'\8%nA/?+6P3:GQj>S6;&4zTπU"tRp1*]-NgZlC;\D)3-_pBfST*:LIpoq[]vY\uoA+sCyz\woV#\tZWcnwZI*v.6WπU"bB*TGT]BZVwi0:gT4MF7*_d_1.jJ5D/tX%a\ye[5t7s8M9\Nfda&%SJQY?,&kIzπU"B]aw3SIgP9GZ7uP\r+b_TRZZ/l&VS7=$O:]=j:SP.P^FRMimcx2)u><EN9ZnChcπU"s('*Es-h't0:CARFcW:H0R%62CK/;tBq2Nz:c;>\Q819_0MI8CuD2p0dKg(yNv$πU"S/ssqCNWw%3P#o9O/tZNWVl^Yrg=QTEW:0:ju4O1Zw>b^r7:v5DnH?ss7]U/]tLπU"8BG+nY)Do.f>HpZ';Fp,>Q/=_3uFS6:oQo-hV;erkQNh7[rUEt)?feX-K:vkCf3πU"d8aTD<trnGv6sS)OLG3l1K2+[Z]9Q,P3FP88S'1Q-ey)t2I$t]pGs%^[oGKC-2jπU"PDu6Zkst5tRC'dUK>%3t8Yck>r^%+XQ2Yc8-a6pdri-c>5)&cSgdqE/E6HgW(8>πU"F#dJ4X+MeA-uY\dDdWi.NPISw&:o:*#QEY)Ru*WjQLfnp4N<E*&>i4?D*969ggoπU"K9?;EhaPJ;/zCM#rXO;GF?)G?R3,kF,%mE.qhqj#2O6RWcJ<?1Rl$M_0vsxpFpjπU"+1h-zZY[\oX4:AT+VHzT>_]m:Ak:rkYIqP_Im/23,(K'SxtcW0ETm(b]W/Gr,19πU"7A4+f<6H>xIpun^mhaDkV%To/yC=U0Tl3]CzPH&'>U/rh3QSVA:f>q%<Hj]uEw6πU"n'9Me5FaJ.U.-\;*jUvcS+x-&Vz.+tjmj[)a+.5-tT',PsIo/ROQ/yigVvT+d#:πU"W2<=Z6k'dnq'_^xfE-CW#4Vj<dsVg)ihfGpuB=h1+XRuN2:#[TND?'b[glBM:u8πU"'tV.N>K%>P;>In,nhukm;a1(6'p][(>FQ/-0dYOmo1UO06byoG6)8g7+.<iFvCGπU"s&PYA1$bpdb]oY=l(^-V6iiSIZnVKXl-WCxtN3Z?haFKprNUbtq,w>%0s.f,WDGπU"]\md8F(4bcPG183'W;*g8mmKl^Yy*\0ie#&e%&J1Bs#<$HG6LXxos<]K4e*+XEeπU"i9v7nN))N^sh2?P9^3WuAcBNKGdhv)\qM4?9Jg3.SkH&<#d-4;;p<p6EP7LpdgRπU"6lirD;xLKd]_kROi'A3MGU>n[<u2wwgo8wXYq]0qo-\%$139'[0*bF6k[Q\HpvMπU"5.=J-rUl7K++<b.MZqO)H\ZI=n6sN.X3ojuJQ3<Wovtub9V,,mshNau1N-xD-enπU"FVKYdrlc:hUpqx(CpMRf[WH=$s=]=EEHCigXhMtZ1t??rK-doROM1uwe<GY$ZsUπU"O''?IxKo>RpT(58'L<>t2kPI7]]M1[Z2'4Xi(/eM3r9As]CIPbc'gCri(%LIV;1πU"+ilD9:'$;[8(=SDiKX%+Ze)nRAMU)qncAu<-;C<2V_AClM42'L)7OP..%>&&[JgπU"PDog>\'9IhT\doNy$XDd(uni9;N^bD:nOrcMDe5yqbVCY_P#sm=k6NN8N'Oa^CMπU"eAld8aJ[LdzSEd#crWX2hifGne('\t6#AE)vycKn#1vegO[L5?ho%i3#jr]Q]$wπU"e*J'>nFNvn,0rnl;O2)V4udw-,D51zBfvJ?F,A#:Q52shS&7z?t0%FlBli<NL.ZπU".X]?Ynx\?:qJ:5BH#.*ON5S42X]e1cY(q7A(rUnyGie[7Df6dvVbPAR-Wd'6n/IπU"Q0ussHw99#0='M7u3dmnTYvusd:]MtM[=K_oUATw27<v/7#*IE1sI)_34D?HW3DπU"=Q4%2Wd]cvaEL%>0WGfEm'-Q6SYU9'2nT[KRo/$ZH=B:rK-^?)&qfR=z+QW]007πU"0L=(az3('gR&j$g=_(LdX8hju*$H*?N,S8/9\#v=sb+Y59,ulqfZVbq=^)'a.d>πU";eZ(S$5i)eF6%hVzDzGII_h%;4)ze2R$8jHQ?gQNm4HGZ\XaF]BP#AqU&nkPB-vπU"EoU;a1WgdKo.G[ZU9uDeQHO;z6;:orQ2nh-vS85uP+rjCNs-QF=8CF8Bp<<x.-mπU"Vx\Lb)&obFNw;+oUXyibSg76KqX<KVT]5B(tq3WX:bjDoUWC>m'XXK2eP^1X.=(πU"G[^8ET;i?k=q?;5LJ.I$F$u<q6bDm&rw<>X(+_8PfS\3vXn]WBFlbxi#t[E1#BlπU"x*9U%tykaZ-qXJ'8(up%()9%%%%-%%Up]F=erW.%l1%%&EQ%%%5%%%MC4<?ITl8πU"5M<0GGLS10BT^?v>TSokF4IwV68f[Ig)]^YrLubvS.].I)g]o9limCa:G]j*;$GπU"g+sZPXEMhGF<L$_IbV9bb0/ldRhRurSRRn,DWsY^)k6fjKA:YB\Q\VYT<zLB[EEπU"U%n_M?e[tE]kbd)m<UV:p_+3Y\;A<;=%[20&P#DFms<_'lv>.ei9D_C20LpIu5fπU"W9O<XLE+H)(,&5[W.[\Vat]jAVv=Z*)'dAC5ZDAX]:*iR])gdUTxc];SUW9B1(4πU"]YS1'2#DSd;UjTqPVkqJ$$Z#pYFFqPV:[bjasP8)mBYdWiyi^0F_Uzu]'PY3K?YπU":TC#9IdCcRF?X9lD7n/)8'w$S,%wgAWe$v&),nfB6[BBB*$J&0P>-4)/\#M$Q5PπU"8+jG7.E59US(_'mh(at=AgAPVw,*tlW^A>Qj#P$kSDt8^$]AH=*24itoa:P_?lTπU"/ZU)hnH52(*CdO1<5WxsO<qjq>2ADUP)Fpk0cgrEdt\[5G/*gni6[p\dTvd^a+xπU"itpmy)m&Rm[aiRg52h<QnD:T#UWTugu54p$o/U>:'6V$Zwh9tv?O>7aNKeED$FtπU"&m<E)F-zV4+\&NN5N=;=1L%r1B[y1HHA2A?9L>kse^8dfgb[hH)x?g:JihsAsViπU"ble:jUmInTLTSxR5r[fHcTn/PpGKE+*Q#f1pYBRdtNetjZ&DP$.[eOuD#/Z8oltπU"<XZGz99OIy]MV/+4jDnY??>a18D$-<US2E:kR-2gZNmdf;.CB/nqujg+'1[Bq+)πU"2]xh)g:^sI$T1A5OhO0c<-u5j0a\R6b;ZAcAOA5'%Q1csQYn,zcl7/TU[rS%:5pπU"TDJe.K%J8Xu('YY(Qs;sO$:.;^e7$^InF0?8:=-#X<jESu?ljKOb%[ZM(rYn0I&πU"7(SgHQ5]Vhb2gUM(L]MTKw\kr+#]T/(:VYS-blDf3z9Z[wh_f1)3vPHCsuvp_&.πU"oZXN.u5Cv?SqLpm^qO>aEiv;Q5R1mP,q8;n(:Nfj*WfuTn<94f\:CXs1c#Wf*EYπU"_]]D?]hUo;du^OP6Kt)f1&zY#1T)\+2k#F$/m$<XRM^1B3E$h]r&mqigW?.\$X6πU"e*Ls'>I*9-CulWp^^3/H>OeAFO+]z5%SYV#]M1RlKNX.v3(S(>[F/e_MXEX_=6LπU"4vr(:sJfQHC9I#]8%pYz_:u8_<RLUw>>mU=;#<wsThW%.&VI()foqcAjH%N%W.1πU"FFE5D2ex3_ZT^$Pz<hD')re13x)R#[mhin2gGko]-I\HMSB=-Yc^_8'UmnsgJ)aπU"TNMSB=fLjeTXy\/>\-o:K[eT4As=_FImA,g&/$5pXT+u;I+zwT;:cD(L2F?YTFrπU"mpv%\KaG/q5hSNeHX5'0-C..l=uOYc)=zeKONP_Bfoq2tBSjjt&%4-11Mzd>*j9πU">[m<*EKAP\6h%-tJCxGq&?1wg=*ws1V>])-3#0UH0C_tFkzjxuhMAFIc=e8=PM)πU"#^d5JA)cW*n'uGYwwi+NLIR+FVvf2B23>-1i6Vwurtgiu/k*Q+6S11*4HhVDCt-πU"\B-pJnOc][o:C.(QD5&NwHZ?pS*?oJJ/L+9%vwl_N*c',nJWbKWa9>ARra]cfRxπU"KF$pD2C)et$*q?g$;Z?*-AnVY?op91YT(6;\cw0PUWqKjr(UoBnMH\7dmHc]<GcπU"/Rfb2a2sB0z=UN1,*VP^FAr7vvYt>0mM.&l)6lT5fWg6QJrPNPDy'mkjgKq]m=wπU"/?#BNM7>sDJS)i1fEz$>*MLI+?-6;2'Y/BeN4xAVQhhuw7QaL+9F4OcS]rmid?lπU"s0Sp'?OMD:\AK-mIC[j)u%m4Wj5h>:u>L^<bBkjiF)'Te8O>TW9^<(UDG(4UaMkπU"WayT]8AbININ8WA'Q&Jpo<1.RK-'Q(CIY6e?<Ls'W;6Mc[5D[.K8G4F0UH3JOvUπU"T5/;47u?o[,*GffC.5WoMW5D\zsBfmthj4VhXK2a4P+C?I<9J/_V/]bV^hJf#^)πU"WEsF?Fx$K115<K1gvH(vWZZ(rRq\D*7vzW3pGd3fW,+[]S[u1:5ui:JsJJh_s36πU"Zji+21Bcd+_>ozJ[zCCiMqR;k(wjeq_kB]_edFVJ;2LgsjeK(6T*J^=0.wgg;R^πU":x#5c,Ok0h1)TKNB=tt5;Q>oR3\8Jj2CnsAL_Jxiw7G&E-8kR/'T>9rOHTYX_Z=πU"MObC:W_Hbs\i[2bP=f>N;6ZHY$,:'Cm?DGW#ReGLmggILVzX?mVAW*GR<=?Ji$gπU"BX<ZE-SWgJ-W&dX8<F'QX_fT7\MBA[brF-(J0Zx+t:u:wcb]V:7;lu[2L<yT:UlπU";7ZV8XBG[U;%N9BOG#:d)#^/,rk&Wa&Jb)/0SL$nx^o683_9nb?=9m5)poJ%8WdπU"&\2v$\wSB,t'1k\nD\YcV-p2m:)Jr_p1L/7N+1Fju1%FCOPbBm:J#(gMbs(NSlQπU"l\S%#);PV*DZ?V(hSZdnsm,(#hzZT,M\tA0GtM4M3tB/V\\kI^AUjNXF(F4ChyLπU"ay7Ta/u3#pW#Cr?KdoR%Mx:w2xd*2LI;kl6ZsvWO2/>ASu^0ltg_E'g]Ptp*F(QπU"65C#j=Hm]lPt]*Xn+_Oc\Bd]^)LIR;3+iL4KL'*T<R'=s*&FFEKj^fnYL(TOg2aπU"R.R,of=02_yq[oBM%M)]i*>&4&v<P$)3mHjE3IQ1e:xs9,$0E^6z\4/ZIkM+ULpπU"?EH?9#N?3v<1GInu,xAGecVz%h%gRlN2kj+IqIIcY?K%(_ks7LFJ(-aXALJbOwKπU"G4BRlle)p>gvfRtFVVmdAG]*\3b0RPtMdP*fC&NMPbNC7qOuF$FPAv9q^7zsndLπU".&b)\5Uhnd?t7k7]L#3EXbZ#hXl2ngDl/m3i[hV8+7dD%%\2LeJg-q7qGDe*G^OπU"6:a8]bjv(4E)sh#f-3)<n)QsJd^nxD)5YQr&mb.W2,9_3jt^C9+fn+&\V+C6;BtπU";QdGT.)wIFL:iYyV'#plC,)4b9_83m1\7Pv3#[(2rIQGt00<X;%-m9[s+2UH:k#πU"qS5K\GtF*oD\zOzUq:+R.qYQQ&wy4w3*Rv,g>_ucdkju6b3e^/2I%6'YlD*t$ZhπU"]%H,:pfN\CDfgf;A=MuPGkYRQ[WR2(*hADP<#P^p[tLqiz0W3eSI^.eS4?SC\)NπU"5o9u)'_S8X07ke=OvmqgUA<$1/6q#'2341L;MBjgaO*H8SoQQ6RnmP?=XN[MfrZπU"k)se>^&\S)dGttpssuQSa.n8rbLfMr<\o2va#ny6\]0wL7ki]pMO7JHN)I;oP+nπU"JJR\nvk27eT*TT-'Ukj.b\)h%v:/6IpC.Lo9>vgNnxgL.yViYkq%_GuLMlYSNMhπU"pbQjC<[&SEh5&Q6+&G<_GoAC*u6qor\J<Bcq/&8U7u,-+dY^7FE8'W>XD?v*tDtπU"i&;J+7x*;9xA\M<0<dV_p5u&;';9oW]8Q2j7_mR^&53AorheXr?U#q4kg>.k97XπU"#fVyohFBdfLk0VqJUCm>t#Tpf5<P-Y3:C>O'Im)]k;VCrSl4JFf2s6:jt4wV*s>πU")sw?Y+fJaL#&b<>AM.A8VF.&QPWq,#Xd]^/RHt]Yfio&s^$^b?pChaWTqjBag#8πU"_ZuPqThC>;NVoTm;gKJFw-IK2r1v>%WKTEr$j+_jn#4<j;76'JO;>n(5,'^[^PlπU"NwTlS]lmzpF[FxMFY#h&':#L7Q'#oW/I/=^7G$7tNH=#2<v66XJ5=mY=)H1XP56πU"NgL$2x:FrboF<?m3X\5=AiHhV>vrmePG-X5XCfDT8Q(1?<[_(qz(O\WX4fi5ZOtπU"(=7(;1*uU+'#:%l3[?*WKil>A#AG&^k2$/&:3p3Q''^zM?iWHcv'/TXbdB'bMFHπU"__Ti2W2n4-USamFZ$Ag<J1D9-mD,:o&Ji<$i.<1R(k-'BGAF9Ti4<b>Nt-w&WQ0πU"%b$a[2gPq0-oK5(M0TsQ6m(Q?-r5Z*qay,\)CDiUFN,t/K60[k^xiD6KEw_1XckπU"LU]#-ukV:TYnsVPl]oB7p$_Uwa48$I+ArTu%p()9%%%%-+%F.[CFg*A+;]&%+%pπU"'%%%4%%L%C4<J?T8<M064BLS10BS\vJ=BSe5K60]N=2qyU9du1<N&oKz/(k'*$pπU"W]K_'fU0cb0XFtq+?87DJsw.tB/eVl4RhR#bT69AzpA425iYu\Y(z'N\L>$9-gZπU"^)fU]4Q6XSi:mpOJfZIxS2EGp[<F=P&'(*zygho_.J09Eqqqpd1ask5F9[zq7.EπU"2&f*;;4/1w4QF,h^W^hsx0-TS\%1M3E_944VgFBlKyY0c%b82a75^U=86C#Q8[)πU"Ev$'u4GdBNHp2v+QFj[cH&]m/5zpJnZuLu)iXzbAM.n+'[2v9&_<2JS72Fmos;JπU"ATRHzXg3ZhY'c2YFe.?*m>+/&45VUll#AK=3VIM)F=qA%0RCNf*,G//>0.SBcyNπU"PL;Yeugzr4h&l>oLZc+*Bg7:CB8PTsNSDu-OLI-aGqHPnhSP'RX0_0kc[0i9[_lπU"]GP;B=>_?id#r5dt,G8=tl8mpwk60kZ7?Dj&o\\eW%q5*d7xMP^jXrG=##R,rHjπU"f)h_d2<*Tda'R49VBDk<(^EbDev?b;w)Z;krt$3qn$S?Qv8O[4(D3hQ^Y(J&Oy.πU"jJG+NZ^'3,>J#P=]nQrHdk=/UhR6\3q]DJ7j64[\#laj8]1i=vp-M6<NPJ+,<R$πU"w*%up()%9%%%#-%XHRZFBV<j]c).%%/4%%%2%I%%C4D<?T:2A03SM10BTkfFASdπU"m5OhFyj3<0eO?;52\nrbeQsR?uQ=QA1f=63PxY11(7Rk8'?[Jr.f5;5mlBq7S^^πU"n]k-n^U:AD0B4JIU2PltMsI3$dZgbb$buLrHNcPg]qhfD^d%S;W3,/3d,6iAZV(πU"?r7U/]N22?R&+]70za\)AK5K#a.'o5,/AmJ8bLINYvwfa1<:iiNT*a6mb?=e1IBπU"V)K9Omk$EpcZG;<4>Pi1a+E<%4,%60r8OWIbJPB2nm4r&]u&]'Z#9_QM#nTsI$6πU"*,WP#Im;nTji&o?QYa+cl)o8)3]Db?w3Q>d*,Se2VW:FrQa2zZA1>:AIznjK1CGπU"g#M(sh_9MMlG?6Lr65;%VhvC\38QY6'$'HC=*(eM,4[AXfg#m+$iQ,56E.U4tqpπU"5+NC#R%4J._5e#<cIE>6F7\[l&RokVSX._]spzSn-d4$sWNT,**4ht^Li7OmDXNπU"B&1r,+'<7s[sK48>)P,hayp'_^aeKB&X[kiJSu^fo\cJ?vMaWB>;hNJ9n1,eq%<πEND SUBπSUB V2πU"At5n\/Ia5\7CXk/n$iKhgjI^nBUgIa++el(a=#7Y*g,F7$Lok,GYlqhahT,u=[0πU"_JF0JaR8kx[k+qYog2'eg7Rq%DtS1H>(fJ9oZdvB%k1wDUZVfTC=[EAVD4(8Z:9πU"Ev/lgW3S^>XeUEU^yebigEQn(1?4d(%u0(LKQW'?8H3'9Uc'YH3=g4pyS1T2w'kπU"MGIRI'?\*d0BHB4(H_RKiX#Ke79v^NXnIHDr8+/$f[uWv&X\SAe'BYz-cmf6\8eπU"8g^qS?lQdSTs+9ID*2(qL(0MQ=pQ;Z=-rf[t))VmnNU7T/Bi'BmKs-18&lXu&\iπU"CE'X[X+-d5f.+P_'i=w=bK.grbR\H18N%_^:?v8l')X065qdICK0hz+%P<rMtm-πU"CI5uX\1+>TqK:g(c)4r;[m3vbIME\$EC+e8df#cKt4EkZoM9:)u<;(cBhndaMqsπU"QB]XAjO_blAe=EVe4ojVYMLG?&A]$2dKvF<H3kqaJHY]]2qcV0sh4Hn$qh>/CzuπU"dGxeL\cX#WrS,J8:NAZTWqfenbuk3GPnuK,(szm.?cd(W2kL6L&c;*q_<p27S]lπU"dyq>V?,FMbht)lEa9*4F,>zZmf+&kKwuxeslgfq'RYv#itOK+XsaB+awa;+#xr[πU"_Mz?80NqxN_b.zkhzU;BE]Uo=&7mxKUdz]6j2ReB8&Oroph-C]ln/YGgIzf'Z,AπU"'qY&ilQr4ar\ht<A%BTKt3io\Y7ZJEqFMhKxaRTZ]i^qMyBS^?k$^qMuB%4?WTeπU"bzd%>9AV*nA>N*;JZe/8'lhT$IfpiDtUb_'RJyl-w5eSMTKxZcqwG4='OJ4^9I:πU"'i\N(AcPNw7T'Ye]lE7&JTp?kh+iCuYAMLCh;bL]y.D^\4&_nune'jedIJ-^9QBπU"=h0O?YZ3LGhWI+&5(_1=ihKj35V&W<5ATAli\hV7eFEs8HiMm>)$CGonnF5[G+<πU"/C*sY#Uo_M?wHJYA]$zX?G1Q;CU6QulQ<u_72(n)ISL(0jV.BXb#<FtGnjJ;1BQπU"m9iX:G)-#uuqd4FTWW%$vQ20ZFlXRA2Tcpv.#ctLN45hK(CdXlhs%<up(%)9%%#πU"%-%_B-UFw^^UvA['%%<%-%%6#%%%C24<?TLq8=42;0EVLS10BK.z,>Aje5KFl[dπU"[;qy/#Yv[GOE:9Pt%3vu.&'[vd#CG6f1K%<Qm>wBxi7J67+FfxGOpZ5hZ2264PFπU"Y<a:=-mLpwd:$:He#M6:PvrF;L_KiSsoXi<BUeaN?hu]1n[B<\Jsxd:z(FVf]\RπU"dry4go&y^C<2Ev5\f<daZR6>I0A221dc?26^Tm*j^_'G:(l7-(RU(9/(CG)S%SbπU"L1sB116E5Ay4mbq?IOkm9QPFI6_^%:(5[)I*$;/5GX4LklA&1L-<^ZIC['FuFY'πU"ZBF&/d;GB/d?)f-N&3z[e:z)n'bM]VjIB>[#;FOAc;ubD>8^.+PW6m7X*5C<cuJπU"[KT7E$0>.>p*Q4;pp0[jSfvz&:/Y992>wF_j^+DHXW%aY%LlQ*,L.,>nmegVtMbπU"?j<AEwMp#x'Y)[[Jq&;c7P6;ji.q(yd\Z[$\N*]_zW4D*U725\VGHWOcY)B0AJ%πU"(AuJFA2R.-V%3pD*Wjz.;fD>pFJ6m;uH?3oo+N6A&?:x:-Xr;G&x\;K#?0Zk:>QπU"45D>>KB#_qWR5Wh_\^C-jfijx$e[kXm.5,wnys,ppp+m\x0t+h0t1hY;TG&vrzqπU"42;%%>;PLN=xF\dfrA1Qm(SHf<=Xd;yEt<?N/whg;%FJTh=Muo,r->5e3JO.ABTπU"IGD^%FPMaI_,:T_*e]gt,fn9zI/(uey1*:Q<PPQiK7ANlQZXR6e=VC$2UrQ.3=$πU"WCNF'UU:%FwOtAB9xp'3$T-F;2r0qz8-)nHv0BTl16;Zlu.;uOu2w=<$t#kKqS,πU"IX?2VJL;4#D)z:i;dgLuhLW$g,qf[c&[6Jd]jPo,]qE+b]Dj$fLR)itB+y.Acv>πU"uOn>tV_NL&M4:i0[vAKl74F:COc_&w=MLR2I^5dKXUpJAVxX26?FV(+>.%up()%πU"9%%%#-%697\FB):?PR'7%%=-%%%6%I%%C4)<?TuM82B22A>;Sh10BFb%ZwSRe5wπU"NgXHV(0/Bokd#5;dKM_91<DW9eYkOwZV?iM__BahAa#nV4)FX-=H=/Xlr_g2TNVπU">F><pe4RT2c#<#UeWWmj=kq*Y6c1\%_oJFp6-.KveAq;jg=g&Amdm#E*7.1q_W6πU"7<6PXU.qd<B5TzO1KM[8^n'V7BoJ'X_XfE[,mUKxu/9=p=I8\V#wVK(^iOes+)UπU"+-KJ<#k/io'/=hqWB/&SVf';,W(KZY7T=suv*tL9R=HlnU'?x1$]/<y:+:$=n2%πU"[B+H3er5>4QFf2>RRFXX:rdAl,feD+?l+ok-:*M%O:8(gV]32b0JWFPubtip2EKπU"b%FG$z]1BYA/=+\OT=x_Ih<j[fBO9[,q5fdhCc/PBpjA+2O)Qx/d8zR.)l>SGkRπU"nk7HTb^Wc3:ElRBx[BchCq?1AW?aPif9yorb$I6?f/M=2Of$aSC>A#y;MmUqqv3πU"DQkEx]:cP5P4;y;lbmgReerl.Fa.H>d_J^4d$OqEYtV:H<T</Mnox$[d:cM;???πU"LNAjR\pl,*V_oB(lLac-#pR0BckPe.VDl2fmd&_X:xZ<lvjjurGAV#zRE^uu8D3πU"[tOq&_Rg86$aS%SlsP/FsT[gc:MnecZZPV_]tONP'xfQd-c^2FOJ0yuftS6YXaMπU"yN4*c8I6hIfjFvxeOhp_+Ua:Epqz\up/+*:RoqD;xk/p:#(HCbDFjMW):ny.>23πU"]w<QYdZOLJq-78N.+%OSUKp3;y'0p:5;;[iSNEVX%]LmFhdZn%6oBghLSvnZ7I.πU"mZP)rb1D<pKm/lveu:Tx$XyQ?T8iv=PUb4U,IglG$O\%6?pmJ*\LhR9,'l]g/MJπU"$)Ih3#tj>Wt1cDs1c%A76+1h'ti%Z'86C2x,gHqb&o8=vNlpe,_sniqi+)cw0z)πU"(xwd.f\6RX?_(dW+/).%up()%/%%%%%%3qR]Fc:7s(E^7%%E^%%%3%I%%C4D<?TπU"BM:D;;LSI8?%up()%9%%%%-%rh.]F7P&N>G'.%%[0%%%3%I%%C4)<?TxM:D;;LSπU"?0;h<a,G'eE1hHX(YJmN5woH8*Pw8l=snIX?^JpAaI$6ph$tYu)l>YuGkw[v1'wπU"7V;B9+kXDJFlXg\)_YkVdm[Y:(l8f_3;/=UJvsI7ur,m_ZOHdlC/XR#6]<iY7V5πU"JAaMU;gI'%\bW./fCWJ7mEm(RU.Q^;L/dfi*Mt9J;^</_Q3P0PotXL[-*#m;v)CπU"_?dZ74K8Be5kWiHO-\A>^iI><Ps5XOK7,(\m,c0Ki\6&&L>LXMnTv%pDF_RMEl:πU"voo_E-/z3H8KWS-5tEXWrI3DfIEM8<^uPH,]YjqCzD^-45+mFFbX4Zb^EiHdHVWπU"^,YQUR,vsa;9xt7EoJRK?$eaGR7,aVdcWV&6e49CH7UqkPu'UxN7ZYR(K6:bL&xπU"s_GNsWE5BajNZBwhrVYxVElNTWbvHLp^2;QYfRn&PEwKvHGILN:X,m9I+$DMNA(πU"3ygUw>bWK//M?=h[<uJQV#RlDtFC/ra:O;BebOVnd6sr^:%YBb4%Y.+?;Rb>GB_πU"6\Z:OXDL<JNk%H0<$9bco,Ypi[Dyiqw0%Bt;2+0h.pvq4x_id<X$tBBRScgYi[%πU"iRSD4?Z8xZF9J83-FH,RuN[m=uXKjB2>.'*<9P*ROow1F7e,Tn42omp^P*>F6e>πU"kK(RTX4-3wcixqGh&C[Sccgu4BE'obtjJtzd^\-5f<a+pZx\ue+vj'v4up%()9%πU"%%%-%'Jo]F#IG-;&'(%%'A-%%%6%%%MC4<?ITx:DM;;?8J2S10kBF%T,=Se5YL0πU"]NDgawo+JA3FF<Myq0Q6%.ak?vSu5&j?A'V[,oTR]dX$47/7,ynF#4j-5V66GmrπU"2G5&*>B?)l)jf+QM+&Mj1qLo^hfe;sm5SnnIbUJ=GqfL[PEVe&q9[&.JVdJ2()[πU"Rh,nPSVftjCIFpiM5:E;=SlcCagZi8_PljwR><Ub;4\P[$A'qkeW'PB7$,L[1raπU"C:m&'N_fXF'v_:z3(GC$TqeQ7T;.RP/C=ncYT$CBM1HR4\IW)H7b1B&V)v&yFfhπU"beE^kXkn&8ePVjXFHb*kSw%&7%hheHAiI9m]u%(^%kFGM2/j?[7=1:ieV4bw$qyπU"0ZUuO%#t.^tvJ03Gq)E0>*F6tjQkcgL'ldchwiVUDwaDC7]DnejX&*H'I;CPJ]&πU"X=j-c?aWBMo1mNVBp\hma&&E^I0NFfpFI[#zsweYV,&SYRRAx2,E0$rE9,f\o*+πU"K^;c$<K%qV)P-*&)S(7*;t4bdMgA8On39?+dfW)30JvFgu>pd(Fb(J_6dB'-m%^πU"d*;0/cVxTnMha/8FL';Dgps^z^Z2K^W&M]7fY)+LQ%:mh*JC.-0xe?lcs1NF2V7πU"n-*&E#qF:7Ls,npF^:Fi7xfT\?U/OoRj-(d0WVt%$Uflu'hiBiGj9_1nj:s[Vr9πU"Ca3Db\d>Q0DpnQdR[eTT-q1ge_bU?L:QVl6ET>./*jb^\$aML3RfAgI.:HOCq?jπU"j+bJSb-#Mo_m+m%-,Abq<=_kQ96i5JV?vuYHbMm21#7RP,(e-bLbYl'm.lIZ9L<πU"E[JnK[/%:t7RDdTib8i6R/FO(b_uN^'j<#/5jxLk<HvE[ub7nrx+F_#Y.iNZ.m6πU"VXl%h79X$]>4wgf*dH7rz$BqE)W<*tmg'7dxkqMP=fc4Rvg'>ZK=4ijK\kC&?(LπU"[jv,>Ag(H+aWwg:1NO>Dfegf_/YL+uE;azUWaApLU91S9&h3/s$SH<'UoUSok*oπU"H?*&g[VmCf<v])6N2ZaxT_:^LLFpxo6Fn_NIw]<FH'4-rdfKb;.(AIUYJ:'&1]iπU"<C^F:NeYwbe_;8%pYCm15_F%9\M=SB;\?-[fg4[RM2iE]K8bx%,up(%)9%%%%-%πU"r#h]Fg][L_v%T%%,'s%%3#%%%C24<?TLx:D;J;S?852e+&S;#$D?_)D[+iWKOs.πU"A;DQ*od)JAg)'Ic35'j0>E7N>Ol-h\Hu3JZHR-:>6#^:fi4Eu_E3TgiC2RV')bsπU"\/OJWAiXwvBWkThPkI)d.Gl3O<Dx5jR1hay-FG=?bD]jDY9%QJ*xNlPT>+;x0^mπU"QdeknY_pjfHhkJhJhrx^x\4>pGa+djQ*$,=Bl^0m#qsuiogiKbr#%0xTCuVKrLaπU"\ifqMG=&+Ut5kT;q(/OknfK?C2+ff,ntrF7Cx.qow$>kWE;VMWbeG6*VO(dZ#j5πU"w9=CNxFH#LukzNI<0/[CcBh+-=9o+1tci5O?E-3K&Gk'[;u4RupqDlH5g&S^\*1πU"-c7>^AJiMu/%5k<t+,rRK5lAh\%/nKAH*2KNQ<6<*0mDNDg.tzJrMi^O?Tr?DdhπU"lQ1#\Nsmm*V>,x:=\vkTpVlHs=-:qc3:B+I*+,-l<]C*w?&TlrgI?L$GB(bgT<4πU"e3u0eT2VB6abYOI#J,=tzT6<%///hSnTBITkd,RJmIbG51^?</H\cH0Cg>Kg.(HπU"LN(C1ni$w4GRC_8j\Y]mz]tcW-('K$xVZ9nJdq_</dAHQi#AAgG<3MlFE'.t-CFπU"M8jRdj3dI,Qu\VQTuDpvOlhgIoNQfbXA'[bk(BLO$5iH^b5F3'Q%sssrdtt&_n-πU"dl]e24LZ3lFNIu;qx:<qMV<L5ah1EjGeg1Q:A]>2GSLo.(PDW;Grl'8\]]dMN)lπU"3rLIO/brvUI)XO+GMU%k[O9K9$Qf#&kFWKfpPF(%^M3EwDGMMBT3wSIQsYl;/'aπU"i_CvLND\,/U,dcYG(MS_D,X4hJCCbdsvAP_HnlD^O4$jK3q[Ps9E5x[c.rbtnwuπU"^(UVlr8KVE9G^-O5]CujwvRC3ooawb]?xHnMT.u-rhKT-47\I*vE)EVY2bS7])uπU"BIoKbhk$(^2ru\Li1Piu^/,S&Rctf0X,Lotc,F#oVqw,7waBJBu3Ig(od9suK>hπU"QjHZ2Vp>VNMR4HKLPT.gm-iO5;qhq&d1'A:%bj=#H^A*w[''0aPfPX:Y(9k(FTpπU"M-HO,7>WwjR4L>Siq,*\Onj/0nuv&P$&[78tN7.5pb?H#^hpc7O2._XUpoUCCw&πU"8IJ=Yjr7)7g%Fx_Yc81i./L1%jZqf.tuiC/_Dqgd(fP<5GAZlIByq<fC>]UR\8PπU"Cw\.WbKcV%*Tm=GEvek%E-FV,>$jJR_-:fF>B&Xe_*P;(v[d?bK9DFJN3N%E2=(πU"Tr(K'l3h)=UhKq;6Hq$TnTuqQ[ogSNFuj[JH;3)HQk*r4OqHP/wTw5qEsSAl6tPπU"JL^V[GXL^V,xL3b$0-?;Mim.KXi#,:ll33;.4+=>%G[Ze0XLl\TNj]JtP4r^A\]πU"60x_4AWLY500ZeO7[?o4:_npFN:G(q-Q750iYGmn2)tQSff$ocX.ninStx<G[e.πU"CBl^kS8[.yU)C]Tjs(i15gK)_*RP)ut]r8?RZ%BXtD98PElsDW[LgWU=M?&suW-πU"v4WQ-/Tm#=5$phFEk(YE7NUu%OhO%2+[mqAvwN3+4npJ5[MdN^OSa4p3x?/+u=$πU"\tEw.D;ZDdad1HWJSVa0'ERVcB3mh2TV'.aKZSN\ukj3Kwl9f3[uAlUf\Mc=]p4πU"m5hE77q\ID]oy<Y.Ym_QMBw0?-N8uM51[l.c\2(^7XfFLFD.5I^pttDwFDL4-$^πU"lXHK\**6[a3j'xco8Qo(T#0i2]Q6)u^5Zg'*2<$)>nw9c%zpf.K:Hhu-u^n.nhMπU"/rZ,I8'+24[,$m([[lkd.e3ujfD]%7zEW\hehjRXGufap6']voALo^*>s9vy59jπU"'HnvJj1BfI?#cqjOa'<O-MoZaH_*vlX0O9RGN6]_Qz][0)-Z9)f%iBuo)*qZijUπU"wC^0YMrUI+l-$(7m%D<-)+Ur*];mG8cn08xp2xJ'fS]k^'IGCZQJJs7)Tk-kfs\πU"???c)tJj=lBt<HMhQG$MI(q8r1/S?6nmoLE_0d16r'Q5f$*0qFCwq<NPj__Df(wπU"Tu&wbhL'Q:]v:9((=Xm/IYDYq1%N_*:x8#d<$AMdJjSPsPGM5z%eCb-O;XIt0l:πU"+4g)B5rtn&rlkZ0Ew]ez&K/-t^DnGhL;H/^PYEk/yx^A3\D09#w=IQ1g6n_T]8%πU"61g--7;NLd*'VQ];^ewm5mY>$>FCc8K6P(O#[bDt:wK.cfGf4RcdFL#Ap8/5n<nπU"-o2S&ih$,9[/O?ZJL7XsmPScjp*lzVMK7E0kmDu\$/?,<KE=-(D,[uZT?w$lPafπU";)EnUR8J0rx&&Ju0xr)Oq#e9_e3a58\AkdVA$g[By4edh(gI4x3]8<%0iU0Md^#πU"Fi;5Jh'Mz-a&'8ZF[Sj3o>mqS8Rfk]NEK7i-2oXI7dfOiHFYjoIrHbfSC7]jbpvπU",?\nfN=cwPYD(SHI0jSBNFmKo1oP/$:(;LOE,)CTg6[f-R*FRqC7,'Bn'fh.QxdπU"h0g9^HTXM+Q=DnYQ\rkkbxkr+&mD:'d(%\q'z&Rs5eck;Q:bJ)bec%9X++Mi>4(πU"wcvf(+(7\bo'r#sf*x$GRXAm9.rH,*IG5RrPgSDDAeO5R.X+SbZZxoO6?PW7.AwπU"BuHaFlf?[0&u.8S$kI4-Y*qS\4DRhNCgkJfnvXSgFx4]Sx)YE(S*s)+AP-F'+E8πU"Cg_hGV##j>?PWOLX+I^TF(t[aZsIoT&SEp,=.+%=(O5g*PkD0lUqoZ$T)l$wL5NπU"sM\/,'[0vdaD^^iMZU\.dK^jz09RCm1z?T$8B>CEjfT'<&Bkg$?wZ#jZwU[y9bfπU"5lX>a8t8SJphVaXy6b$ZJJJ+,=E]j#QYrMpe.&Jb?DSZM^q4nn:Su#e^_.Jny&<πU"ITYhq'$SFeU5$w&9KUYw31xqn<)4SW=9LUn2M6oI['Y5F$DY\U<dfMNI>NE2j0pπU"/P[]i,txZvLGf*.I%rYjPZ^Q^RoO:,):PIJiWW?*-v-C8cJ(If+2IJI]TXBi-UVπU"R7CBoExjOh6LLdoE4?EH&<'B[P*&5Bcj+7e2K,z*<9n(#Qwq?\Jh0aRCJ,-7YfXπU"-X-$t*FVIws/S&5aZ*#OfJAE-l'V/rLsTw_N2Saq)Wh#PiJV7/=lS:[H$]Fsrs'πU"Q)'<1Sl($7J)T[>enp]DRI/]Bw)lg(;1vR?gnoopo+L\7/UaqApn*#<bBmpos44πU"R8%T&e*hRE%fd=UJ8kZ9]PBQ>d$Va5jU=K2iWhtX=KOFfY4j'0F*Ug=R&a/.πU"wxY$kV0aD/lpdbE$&E3.i</A$fO-c;^t8c3+\5\,:UrhpC(+t%BL1G:$cK=5:(eπU"5I]#3DRzEO9aE5ERk+[^%3tpJ3,<ln6b.9ZRoF^$[;4'a:g%EI-Z$+hRI1/Tq%*πU"Gj:QCv(JrUyP>2R7:DMaI(]S6*sDUo:P_M't[U=:ec-<XYBqm),OLAU,25='HCkπU"FCm,0(9.7AR0<M0-Q:\[D.e:99DS;s\cAuVcDrbgY2?8\m$Ml&-FQ/%]kzeB>mDπU"8VQ8kj=WVV,g:z5RXpD'ba.ViQ7I;_pjB(:.kOb5bT]/aq$7T3*0sgs:O6iT5/uπU"j><a(ufn%:H6&Vi0AQctny?ZqOqaZG0U=VKf16<c+U;nS-qkXdfdKD4z&'UdKY%πU"/I(_'o2%PDebj.UH)R,L7-.#c<w/jv#N=%:+MCvj=;<5U%%G+.M:xvk]G<HHaBWπU"\_?A+#^hvGk8U7G-MmY<WxEPv$.'TO%(1vTZk)Kw<pX-o6Sjd[u(.-_=%_:$-4+πU"><s&iwGP'htz)sFN;Dh>(2u^$/h;X%;NGR_KuA;l\>T0D:lT=j:98V;KsV-0qNNπU"y0G=J];WP+1L2,IyBr-HYIwicd:&mG7QoZ9IDI3AFjsKt01otQ91GHBZH#jF^nSπU"]42%I1<TtF71N4%[-u3&'A(GCF(9+V#^K_5b5c'X)gs[t[Dj4-1Zw5e<j)#FQl2πU"#,75Of9D,r\w5'B0_(/4m3l'$q;&.m_X/Rj3$Bfb7c%P)[/F&]$C6LfI,bKN[i9πU"FvkT*_e=?=^]0]4Fs&eo:gFERaXN:F471j^e#JHSN:];gxvjw21PZJ#4rU(+uOAπU"%)G<\/#Y7B&la-MK*[Sfi5ls\JI0FSjXrB)f]m'8s9KQ'19RL[*SQ'8wBKDg;'MπU"BAm2u;>.8Il'=p1YlkP^<2f?3ePGqCE2ZvjQfC&p1Jd<6('*=5]na\U6#,]_wl[πU"6\YMnxH=-/$+mTS7sO08L%dtNGiHKH_26c0Y_l=(KsopE&wQF'T2nqB5sAjFkv?πU"7E'Jdc4o44TXWgKLFb6C>K&O:pF2xJnArm;T[\0D-79:4$c.e,*QN-FmVQig*stπU"Ef_ubJYRtuMcN$2c+,?GG&EmAuQ9.yOM*Kj;eQ8'H-29l*DSCS&ecDX?IK($IuBπU">Hi&5\Aq,6bXoi.Ex$u%IA;n]^:jqYkmb<'k%kKI5]saWVb>a=X0(S&t5Rq8z[XπU"sYJ&OdYPO;1;4>$0k+j?rW<k$;u0[BFi+L_w'=B$m&w2iG)0W\vCycb#tXhvM[;πU"9Zk#,KKn#D((,M9>IEuS022j+3gluFrlfoAhwGCZ8>-2'KLR_[/Aw*Ul,sHxJ0dπU"2g;K6+v8GO=;tWU'Q:h:'5&fGp/U85SF5$&nv/]GR4W3F/%R:Z>zVsSXv'dt/p(πU"((7HQ?&nCC%H9Th+Eu7_IoLjs<nC;puO8H>U*I9oi$:bq<07uXG4M3(YS=\jZb+πU"?kl\>-ZGP&6)-)G)NoLp.X]>5KFE_AaZVS9?)AUc%X0uWrLiV_;nI&8*iSS8X(KπU"3#YOv+j[Cc/]DvA5-A[e=BPWHjTg)&V?^ZuN//4*5ScUFR$O;2-q+n<Y#$lMr/^πU"s*'q)Mx4^P3$TTH(M>7<S:&;N?IfjEZ^_[\MF1fUfUo&2ZT<:;EbNpz$<501lTwπU"6<+Ms^uV2UN3:iS33Y*i(Os6kl/etL%QL<[t*h5L6rs%aL-N70fA9PG?kBsT192πU"7WW9qIp1b/A&Lq[Cn]'Ly%rLq;,$ALeIIl06.k,+>Kd>F'gdO7h8(]LTS4IJ6MsπU"Ft'r=;Sd4WUIITaj=,E2Db('mDI<tD/GeS.'#Z2F2?7VmYZx6Q644-fSdy#FEh&πU"Ns'$dg)1Kfb,25_ro>p0'WN#$3T,fqjc,b):$Z^S:%6+<;Pnwl]tf0kJ<WKiXeRπU")]>AlhvkL7/jp2x)5_Z(+;o&$A9*9]t]fikmD%\MI\fosdPuT.lq3pHQ,qhUNk.πU"LIG20;0<e+e3-H=%jhH'N?g_Wm2nm)#C2pYPeF3A<jW%;kuC_oAANzdR*M:?#s<πU"(v5vBFoKJbN=hq*7RWirV?EW#<^d%<)oq(Zw)4[OPf-:Vcw7gu;fRciS./ot[K>πU"1j1AHLKnD7I:Pwjk*aK]MYi]A_1B?r9^uVWeJCg=Ub;l;lK*4u?RtOGXBwt[3z=πU"p?v2v,YPnk.Ur.5Gs6rtcCrlT>>4<Vdc]p_nF<EXh7Dex0CZ&cgOx[I)>dB6kQ2πU"Ld1;-Rs&.1g#6='AX_rOoZ$miDI-Z)I3KIk&%#+R'+/S=_.R%IcX(\t-cKM9-MqπU"bvl:'YCYs4L<RYTOg5-o:JgiL(.KiPCen?]k4Fx[:iPWJbgD#?dU5WRG^j%NEt]πU"ERq7&)(t7OD?/W+NP#AQy6G:1<z'OC''Q._S$mw)N1t?b6>1XzL:EGhECKZBz;[πU"\[Gg/Q-)=iIwqOB?9[-#Qq9v+qY4\A991w#KwydAR]h5l>e7GE=>b7))t'UCl5]πU"?CSz=s1#xcr4-EE0,[x3HrS%($:C2jL2:0Y4Bn(A[P^\K,1c>&\SG=5R75-=>mpπU"yv41<-GQgZK9;nkWZxTu96((KrkG\*,+/cWrVHa+re_LiH5E6W/.chmY2,.12mEπU"]g6+gL&)66-C^Wsp(8v.9dKidhacHHhUJ)hrw&$Dt*j9o6<DCh=%[PU(^\-S':.πU"g-HqLK*J%sU3m[z=Ibh9lA;Q/+*#JX952QYcOggq:R*N#2?d8>+0RM/+yL)hQ(QπU"&Fgc[d_r&Pi9.=[)WOuQ'Sjz08*0EhVpY4jv*G$'20AGHYieL6m)DgOpxD$POW/πU"-(bl&0M\6IhfV*D%^'D(k4?ifV9F9]c]+I?i(PrJ9\?.q.5\2>&<k3.q%GudAF:πU"ut-G-nx7/kD/7Qe?qPDz#c1nr^'08^0kwACM;ZJexjbTr.uM+(kB,d5uTE^K]JEπU"],,p<Vb>QBMDotG6[Qg68^PCb&_'\0QZirHkkDg_KEqD=WG=R%YDkR;ZoQ='+W*πU"PK[+ht8u4fSW+kn6%bFWXG1-PQ+=Drk(NeNt?&#\(b?gM-8YQ^+8n3U?9<6G;>iπU"Dw+)Kd:GFGI?_lok3aY3)4(+TfhMaVldLdUo</98f0FXe.1<X&&m4otQ=,ttm'&πU"wRzqc.E5P5DjS-Z<[zqVMEDUGa<5:IMYeR&y_0(XL]m;R,RUSl_OY*HjM;\f*KLπU"8U,#Th*VaY9l+%Lqf-j#r+o)W->x7z2WML<\%r/1t5/XJDE:nY)^r1Dn'(*4W=gπU"8pTI,oB1-dtBq\q_?.TPa,ujpC4nM>s:^Jhe*XdkNmCt94zENmeWABlE3oY)k96πU"KkiQ-<mrqng>nbfmv-*qD,^'k;X6vUBTD]t8x\$VUW5b_T^*ALT<8Pd\Ts8pk+QπU"oOf>3dKLP[BifE]H94O,,F9IL^uzHpxd<sG(D'dLs2j*=V,*UginCQ.M\zNBWHAπU"ep\GaYYd$<F&1d2'Fbth*FraHUUV4:#P079c5<,+N2M6+De[ispCC.Hj.5amu?9πU"DtEF0wTHoPDT?5LV>(hR1dxEiH#3+R<>&o:%2=g2;n**UWM#n?EeE&:TOyYbdRpπU"N#5[RuLM%GjV.4X/kS18(USHJ0$)2gf:s$LY)4SK8i##$;:#eB4LI6k<1Z>WYk'πU"Ei&c^S/.B6]>U0Jh]g3UC.*PpeL3gPOm,Y]vDtLXHh-$6T7?BPYk=^S8EWF04V&πU"gCnN&iVK]=z4LBS7?SG)YoGNj2u9d.]lS)FeL8>)Ngn2q/x)rUQdF:Zr%s5b(C<πU"Uni2qf%^1v]n'mZ4t6w^HY=w^%VOoxT(DC]+=;FXpm/Vw]+PU]?bW:?K0ekmRrGπU"HNJdw.LfCP8%<[yPzdAECpx?7rmA#4]4D8_97b<Z59?B?kyHXqNlJL%9<M>XqC>πU";W-76sp62m2t.D0cv(l9+2U/EF+RMo6YF]%Kd<5_O0F?K+aj2vSay6C__l[_?u_πU"awQ:I4]*5&A$gz)'E9AG%$k.vRQ.T'otd2+q+TO]wDqA2eY0Mu9iDnK3ar11rvBπU"t:$n)eU7H6$(E22ML'[DOK'e=6Nbd'#Y[m6JvQ\BfjwA.8Gzq1<LY04S9lIcFD^πU"6Uy:+Qa1bXYW$<5J]]3f4hnWtn1k8Q-6>K)Qg;RgRoh'O%2I%eiZj9>4Yuh_.A=πU"J-esvY(pRQCo>-rBl)EE'IQRrD*p%Ye\q:Ny_Q/cFa((d93xJ+7[jc,QGP#VgwQπU"=t9er,Q]rog/_T)>aOwcRp1cyAQ#M21_SJ5i]+g,O%7pc,)f7/Do6%XaC=4To/gπU"mf(FWfeL28U\4i1w5It1\[jtcr5bq]sHjRMy/ineXq=JKrxsz0>I?d[j]$%/CL3πU"WLqu?AirVi2>?u3c#U=(ad#rLIEZ2QSW&6gdC:l)ehs272bUj$q0?TPR],nuu$jπU"'cuG>U(\VA)OGYki'DM>^=X\MFa2,_qW6qT=(p3mv*99cDDPk(k.(]3NSv8dt]OπU"6+k'\V.,gt[yCMz6e)+R#WE3%MG<HYPR,mm=2m]Y-.)YKZFj0*6X&1DYSQ,]XA6πEND SUBπSUB V3πU"o=yOd$O&yViIcA&[3k5eRD#Hwi3,B&mdLYfKm+eXo=CGC#>*w[s%>kr4WuUpCAGπU"q[8tK9*AfDJTS>c^'F_uP3HbE$,6,wQIWg1'rSw$b/,6aIXp5\p,m1#g8Vb01s(πU"am>B4BFwklJIv$.5d2]8G,s4i4)>e8,:a02#KC%%9bb+VaNn*a'#D8aQX#Qnm=SπU"6.$Vys=td>,p(p4x*)=>TU'K[zYfS0C*#(_&WA*:I>PpU1)OTHA?oE=7=7+M=THπU"0laEs1_l\e&d)6w3Ra0Bveg#RRzkBo09S_QMhKq7I[rO1UD]ck;#DuYH>1*)2<=πU"jdAl:sL<>UnY&jqq_g6Qt-,[0A^a.OKwGM-0K�W##T195\j^*;#yT(.-fBg(vπU"iBJxsts:>/vqLl0T0Qi8_]B.9OkZAso#I9#a/JDjE6H:\/2DU_q\Asx^,Af=UhYπU"/jG+Z)ZlEoho8RWaeuRVu%(-RrGb/N\5e4<0<T;Cr/6HKTeSthJJJt-r1QJ,bBnπU"rN('uy<bWXv&]pAySu1LyYnGI$Ypjj+A5ys6Tk^-=p$Ee1/:pAQnvK^uhGI7K+CπU"FC[/su7ZQj=pfB9J2;$vj8.DnC&RSWeuQ:9efV]o*2_51QkOk=p%ZdKQ7j,-TvwπU"Qk33[hXkQqAx'X_YQ5%W<t=MK4Cg2$0)\dR7Hhwp-m%ZyL>emiL:v,M*KTJMVSWπU"A&AFFD]Fbi4E+\m&,luYhmI=iOngMtL3RzY?Je+Zi^0Zc]sWEQ'iqE(AaN1n537πU"Mclad[414]2OEH%wmBykKusf.QR95FSddk&_jmf[InKgiBA__ObV-RNV0so:RDBπU"M8bsv^eS#=)6q9N%b5B9ofcHQQ8=>:_+;%Z-opE.I>A1BFWB_N82iU*A+zU?'W%πU"AQ\3'xYW)\Comdzo6.+v:yJA?Cg+_s%6mZDDfy#_mWY'LB9[kkXS.GbT\U-:t31πU"71I/V\;dI7.,x^fck:l;*mUr1E,X8[0,+OG)>vJVa3_vG&[P^r^$TrLg:v)*=O$πU"wvtjMnL;50?UmPEll2E0)rrj5ZmEvjM8)G7z%uj4[SE#naKl'g-gGUvpkLDUtvTπU"F52S'<5\DUm/jO>f+bY?/dl6p10Y?(>vyh6F)Fu4QDP^rE3+\m]a*LNo*Disz\%πU"w,(x;-WUVeFIMw+7[7y)Ka31=YWP;.imC:_CJY4p2^]Y*n(<Qa3\b[uM0--$D%%πU"?n<-n,j/'$Y+ms+$Pj(YI;C($_e>:FIjKYFs\1O6-9Vq7?6vaAm<p+_10NPiUiTπU"%AUgx,P6pm__#%7]_$PWcwVssLdJIR&;=$:NqPPL:hXwE$2IZ>h^9b(GOC*%QnoπU"Z2X4&8f&4C#?SY0JM&E(<:cL2N=9HU$Q:#X[0cW9n=EhvC#iKxe$S<b,LZtor>nπU"$yxghSkfqO5*NxErptuJ;[MKW\>pN,.',50Ad/b$3B9D-FvCZi&^T)thi?2XDAdπU"R7)>[EmW&H;E,_EZob<v*aJ>wB56rH8sLdwcEl%HWXK*5W*6jq)2R;$FOCn%.p8πU"-O1ZU3Zf&*fg+K6&lxE%u#YSy:eC5coN8E1d6B\U^2HUg'[&El21qj2:YcT*6ueπU"=4DmubCF.6>7t?4K[<(/?#D_=LD5(1&Lo:MUo(+:dB[>pb[;GP;<s<6mvCPG-GFπU"ABMl#v]FA7PCWTeT_G/nkx:'#l^KL]L)+>WKK[8(Q/gL\s#0MxUv1%oy:>kqeRjπU"gp3+=u+Z&n//ZX=cb(Kh<Lg7l.(^q6fn*gYz+$fT9m7VR5S'Kcv6SAk.4L,dMP)πU"*5;$TD6.E9(Y+(3T[Egg4[z\bNM+;)2mAaF\#))3a0VA]2K,aq=Q2_J\Q3;+g0dπU"5pr/LgQ9$>k=e)g(U<;\5LxP>](-tIf?X)9TmLGM_w-+b9ypKA9w'NFr;B2NObyπU"fDDu_FeQvn)$j:BnVpml:7m9%fo4M\$:ZA.p?ea6A,_194ES$LQF,)V\r9-Yjd\πU"Yd-OC0sSrpqvs)[PL-TTp4>[]NNZe=+:Fz4W>dZtYF06ba/,E&+S?NKpdj$bgSQπU"[B3O+1'(,['%Oi$kNZ&uC8Z1s79h6tTc5Xp(Q,iP\8JM3U?]br-=NnsrKnKdz-.πU"UESJmuu5/krrHmY_I#jT2F,uVkkE2[F8&Ji)*g-wZWd/h0GDbWgLgOum)pWz9B2πU"CPMR,68XODc]Bo6vXj=[a)#(.%KIVCyNKqe1s'*\Ft;Xg$_qTHkfedNiw50YbGFπU"L[Ql'a]4CtTxEAg_GW;?U1zO7BNejX=lC&jJV2aP3n12+ea]05EA<<ZKl-iBn,OπU"1q-md'>]Bs7F&w<Oji7J0BmtbcgsLDVIqNS[L*'1EvIF$\uEhI#[_+7*gY$.,5KπU",+Z_Odc7yXGmLO#[?iT+2'zi0GMD+EeQzz)CC<XJbxgkWQbKIkQU.#idS1Ra>E$πU"5?wXoduvbF7BPo6^Ia>[K(^imKNLbu6r:yN+q:8LN7thp/lc*bQZ>Z5-Jy-NA-XπU"srqPWW'#Wc]+Pa3_j_&:$Dy:siog2L0p/cq6*i6bwhYZ)ueh$ULiH7H;jjYADiBπU"PTcV_JKYf)hf-NsVP.tpac8OjGZp1V/+((Z,;4yWjF;7GYWoHe(*]z9<>wMBtzVπU")9&bg;'AHWc$Sp\)9O7\;%QK)2z&Y#H-)nUX:Q6*EEd67f9So;atBNxjOg3[.d>πU"9PE4*lsX'7PA:fSD?Y61:#.mW2^)96FOMg&_9HLIJ*(e2$4D,6DJc]-f3Jm]#)fπU"i#diZ$sHgb(Aprm-t#Il^,_&fWFhoD7'2]5&Oy0Zu1LIQXsqOJ0/>1V,47r88(AπU"7fTe'sAdmDeAUfS#/=r5pCj3wM=0jno1c'*FMA;BjOyFW=0#9xh?2'e/)%fXWDnπU"*rsMN.8Oaz5z.ixngck1Jkc-yt0Ie7Klef\;?VI'ETuh'MFU;p#yO:C*VA=fT?GπU"BbdIJ/V1to$yXtZBIYo9u396zJCpgU-HREqFGoq^1u&A>FS=g;e4_Tx_F/tJ6K]πU"<BfX*Jdl-(EB7pPsJC#9G[_EVQP8*Z,9B)HoE)#VfwbU]EGb+=<duQfDN>0kfHZπU"pmw5=q$q$$ng+UX^/q+ISc;sx*4RGzNe/0fT&S#[2acVj<\2d8]+D%0gI/wkj.XπU"o4Qr7&nb>2$G&^'>80EjHrfu2N6:*Y)W=Z;g%bZ(H7k%:D7k_tsDSYT[riSRZ8QπU"[KphKqWklSaW:RxI94.'tG(bMjbumbZ2b0(5H[zUiFvY>bqJN$^>2'%4FL<8eLQπU"3?[W4cMrL.=H2kc8s7Azv/(FK'<>f6,;5;9>MpKv,a2OZe\[q6'<tAFhUbF4Jb6πU"v5GJSSr5E9o'1u4u.%p.;='ebibesLJ\sVa)Aw9BlGtPQ^D>yBM;ICns^xv'Ee/πU"'N7qVnXI[b?&y+-GY0IdrpSfvA$2:kxqL-5WA\-)8lQi14(3)dmTTADOe.kq[&EπU"3QI]DUm'W]t3t.h_1>u?Pi&m6aWESj*&RBpj/[:I:c)=ea&n*Lj,(t>:sEh1F['πU"$tH.%lg6DVoAPQZ8v<U*Mz%.CP:GsaF.&K=o$7JfSCM1Pb0jeT4mKh$lj=Xr]rOπU"i#'isKAJ]KtLEkwWXWV<H^:KUofEopAl+W$<;59)q<PyWPqWNAV,?5qYr68DY9nπU"3&?K5IZc_GtNP5$R<fm4PiKQgi_F?U7qHxK=6Ek_/.]l6SeTp^2D0S1sG)9<62nπU"9Y'6cg#ApmI;ps]y,?_Z<0+7N9:'3N5r]CNu-oxOIB2[GJC2ykz,(01rXO-9>%%πU"I)*[?QUA)[]j*ee2.h&Lfk+5w0s'01%.31>e9s(6a7I%Iok+10):_8e3G(mt('ZπU"C2+mF+9wcT8g-h]Ds8xIoJbvf9\lw[;dLN]cvs#Rgfq^R,eY\f4%1=EX?$Q\U0VπU"JWcv?RM;9GTRt$MM:sIG,DM7dQeCdyoXiac(HrB#V-fVPDd0M'sP;ditcZWSHCpπU".Bk$[IewpBewz?+G^l'bJoCQf,H;w'#WC(=tKZ=g].9fG)A]StMSqwXxis*iO/(πU"mJeZ$c5EZJ7eSZac)%?(T\j-hqObjfkb%)#f33tPV:Uzw9JXSh*'k0jRXZ'-N0pπU"0llQ*&-ZmXnp\]QPI21j11Y>q8v&2#LO#Xf5okQQsCH0P%fSu/(1id9M7r;rE_CπU"RGbTMhJQfnAEzJnb=b<C8/*4A'8R4c?7pbT<u5$voa[(>kh=%;JMaep/N#'g:c&πU"s=t.K:hW=Bt)5&(t)d[XF^A2IzPDQeT.lT0XQp\JfnN(VabHPGLJVm;b6d0s47PπU"LaFMfd<.7X0]8#,^QCG\GLoZ?UL1%Jm*f7#,dZfM8-86W[;?9GMMFt0Rd*;ohG=πU"lBDTvPIdwe.Su(tj=5TMPZ>oD,?K2npL-u<0/>EeMSYa#Yt>-8-9_Xu'MRiBH\hπU".vX2#inQFHub:dFuUYLU*9(78IF\d0WL1QZ7h=ZN&_t[Saih+K+?#Dr(sW][i)9πU"q>3/v?#8x>eMbK7,M^?heVWWXHhn5_dWTKQ'+DI31;i]>f1h'-FK2H\eu^ERkDWπU"NpQ#VBMHCxu%V0H).<ih6'$H4T/Y#t%RZXS&(Kpoj0n_ysBmWSE4Xii1\:lXM13πU"q+G)Qj1Gqp&:*Jt?:,u]nrTQMDA:g10VT]73y=h9E9L$jt3r8*v(I(>$m\Jh'N7πU"V#MIre.DFSa'=TIHXgu%)iFut3iFuB2fv7LL3dDj).mS[(_DKw-LUk8K-i:\(gcπU"Q:tPts1bKbHEilDx=Y]wkDLiq3HHt%e%r(vzZHIg;v*]1h'DlKr?b\\b\8G/0.%πU"=.9pk06H7)sv/Xv,Go>-S1%8mO5xlbndDu>NV.$M)?31tkVs1XF8HAIigTfstwIπU"iboDX[;,JgN04yRPiM3EEEcHV\8b-P.G?-lm<BjpoI$.D:\P;M/apKFcDU<0:P5πU"^jH>>:O%vRTR,L,/u?L^uNZ4$ZnjlKpTF84*dUg%G\?4<XQq*Hg>J(kFU5t,hG1πU"7\8+9Lgma;3<-KjNCdU)SaLgHO>vS,WSsBiw(u:^:_zZsXKsJSso8A>l[hjV:Y>πU"\q7kKXs^mYTxlSm,5+mtab/1;[lbTT:dbqn+mj[X;58XRX4En-OTQdIwyOd<;9xπU"Exq<c.cKe5,0Zn.)[.%m:NvT]?Pm.bo1)>b2Izy4C+snz)XL.ceMpOXZG[kH$*KπU"f#>$]/z>M0J::l&uT#)P,#:1-I)RkG;?PEKw&mpkBGiCa?%6W7srtxM)rTR6LI?πU"&F%HVn'KbM:jV8%mf%eO-w=KPdgd/#]OKq1nP^/]j&uZZ]:5-bl0r,h_$tqPsLgπU"$V^(M?QbLZV]u\9W-6Ol*Y.13B)'my3OsHkjCScdiUbC\zYC(%4.)u-N^No<WE?πU"#g9Fq>h^uw,6lU0#[Wc\qc]*&LUg2VQAc&,D3Oa0.uMf#xK2I73YF8_w&RNOaJ_πU"rKsaN&z*b/Rfo'sFTJ8Si+TrUH<Og_iI))O&V=xr/oVS$cg>o]1ItQ;+g$\$qNMπU",4UVv/EFTRTA[KX$,pXnvFtnVeE$HP\lUx%6eUtKPp-u3drE1>p-68Pt\nApVq:πU"Lz\0AD_6kHt7Vw38.=i&C-sIS0h%R6\I_4Q:(;;t*9ub.1abnM]v<I#0wPf6'V9πU"Ys;oMP=_r0kWGF\6s_?4.Uq5')e#+3L)zvwQ?w_]yhA5eknR*:YX(1i<)x'O:bAπU"lLLtxmJBEE1WN-&[9<5ZN*0p.vnYr?tp(7aalpH$LD%kN5A&*N9b_HJxaRYzbb8πU"/'FK5gAysL0by932%/eSs;kR,PBb2Vq^6Z._far#3_AP[Bb,4ihE\<VnHDwKtN<πU"qa%eN[W+3tfIC8CSb^s6s<S*?/DoJO]lo2QT]o=O*pnF<HR=^iRub6gUTZfo6JkπU"<oF1orv671,%qCgceu,AghN9AHSa?#IjdOU\9_YQI*5vib+?.D(x\wur2t0p4YXπU"+t6J/Jk,,hE=,#LlGaBHxb+7e*Q^+[nW.GB)aS;Gd5Y\c;.cc:^rFI&2Ck*T.ZjπU"oPrXTXaNPY:%K>[fn'aHgviT8or4#^d0%]-'dQQ$QqL/p2-=Z=W\<qGHaM6'w6=πU"kC>Ee>VrD92Go5$h=?MDB-P)>5IEj46qluHsn2*?kNot<Z#97KrnSS+AR^EkMkMπU">ES=c0_/vRG6P;(7.U;m5hIhXv7Y&PgO?Z.P$Glnf)P#r;Y$:%jYf=;kA-$Q5'0πU"d:/ZVD(i2JFKE\3.*?\0LCW:ltxm[u(9l9nhxllTRwJU>XE+z&C_ZPUzw1-GsczπU"vlK5J8oL;u3p\Ui2nLT>[:Hr(s(Bh^^)ftR<kI84Dl7UxKq*_CFTX=8)u.7;AujπU"oTvPD9eMLar1##_.q4?GJ/0jP/e&J>SEy9riON]lrrckCm?rl*jr4:9\7Cu>#o8πU"Ml0*hQ9Mt+c7TQ<7X*O.$Kj4Z31;d^bnbSfren\IA89C3pVK)os2A2t-]<GsZ_8πU"O,7Cqhg,qwTm&*k8XO0DE$iF+'L'&U\(in%zNfY#iUbDrRf<fnV5J9Q$#$VGxLDπU"2b<VPHl-4,]m)dg=NVq$Z8Dfpt*i['7hl2tFj7dfKqIMn24*3sp<wmDovk-^$?KπU"8h7f/_s'f0E0rZjPRP68\=M/h=gBV0vV&doQ9PPUB>5fpki=>rSW7^oR8CCAlHXπU"OORPW?^WrX2n[To(BrMnN4d;kj&KsYW3YWP5oFYMLtZHs(:J6Z^X8PevBhQf8%2πU"ox98H3su^)Xdvgk6q;D&D+zzypz'831'>u33\J&tbt&TfYM$<^i+.n8kI.I,i7EπU"66u6w$<pd=hW0Od8I>x*68j<'-8ENOB.sCvV6MLpNa7m&S/9gm#+YCJYBLv;G.*πU"SW9NcKxS;T^0ddCEaK1.W./SRq-abcgrOaCOVhk[D,km3(0$Mt%qrB>>Z[<<?ZcπU"o[L;sl9T9uq0EtiD$JJCm&d)MEeJAt7:)um*cCAUljH1BjR9y?XTj*>z4=LcD8LπU":=<Li4uQCvCu]uW<6RJVgYn#iN+2\+04X?9Ss%B[3&Lbe$fJhjmn02kmI5,qlHaπU"7y$C075XTEXd[\V.1\[w3PlLG2an-27)=RGojA_^6$B+tGRt,hdFvf?ej[su)W*πU"yzP;WljYqu[N4(Pr,E8m+wHjlJe.<l-?9OX4*-LG#c'jVi>YT[<11-^2:5an_-CπU")JzNPk08Y8;rrV(-M%dSFi?EKhPI'MS[Wo=E0a))juai;%&kx_#P>D78)lHhQi9πU"B>1w+.'qF$6Lf=PHLB3\3mbau-p]c*b2b50M1=4\x^NoF_dLpwC%m5phY%G<^rYπU"o7uYW$I-cu-yQ:E\Ioncu$$qXf??LgWwk6-MO_?srn?f5ZMgGPe71lUZdaqL_BbπU"Bu)I(jlr$PX$)rY#usmu(KIGxowzo$(s3)tB6YFc?(oQ;[2npjtB&<9E?17NjJrπU"DZB1YgydduNn05zMIaEduB\>b)0%=zHx3-.l*FLi=MnKUhB'HiJ5&&pArG?D-tOπU"'q0O8Q;(Ts/Jqr(PXr00.g#B>G-CgLdlmXa\hUB?HH.;lPO3TGa6A=)<QeuO2RcπU"$gr=?llnQn5%)G,cJC5KC]1#U[UFR1<a-lEc:]<+lCIP%ObSXut'r6CQ%QxhI<7πU"rj\?Uu5r$??#).NI\&_D%?8.%(EHUZMAq[-FMSJR-l'qmB,jGRCn).O/TFAMfBOπU"Ra?jbQ:;kXCes:O9\9$E0kx7:mug;_P/%-)s9dFM&/PQ-6ZJA6iJgnZCn<=U;emπU"Rc%vH=..$crl]f2(n'\]qs[S16(MWI]d>wif20j*IK[qSdh*Zpz%AtLz^dAy?YFπU"&q_G-;<tRCwsm$.GjY9.NwsF'Idup%()9%%%%-%'<o]F\v<aZ&b'%%&H*%%%6%%πU"%MC4<?ITx:DM;;?DJCS10DBty*)>jU9tM0]x;?i/PBRmjWK+ZwlBMIsR(o#)y-bπU"sk803jrut#RYXQhQg+K3rJgm:No2GKX^nm4cl8_f#1\0-q%vskBR1++(38;'MT9πU"C6m^nE\Q^.5Q83QuI:86;Fk#H_+cu[Rta?+Ba4Mh%]cJx=[,V%N'J^cYGPgc6XRπU"^1O't]H#GaN.5A1Q&MwDUUevMRm(>Avn8]-oBqSzFs%y#>kh&fJ,.byieT9rV=tπU"yNO-cVvq,'cy#=&,fnn2GQcBqXNw3D(DQGQS0S#nV779aSIa\sCQg[pC*iZE1^:πU"u'(v'=%9:j)*Hj=z%6f.G.=5?U&Vh0]4K5j4%K<_I/e)Hf;N.q,\e'agcd)o\aYπU"t6?>4-D>gBi,oj59Zs7tMRoo^jZsAo5-bCZ3v-2s(S5S(;&Y[+O<0N:LUkDc[BMπU"%b*9&jVOju.Z3:eC>YWZ&S_\Qs%FI:-aoY8&:VlolmLuJt9TaA.'>+ZN:dYdD9*πU"E)$MUHabPmP4.30n*_yjo*R29V?,nGicr#ER/bg&<H$\hM.<N,cO*gi7AJWS)?TπU"_YHl*;JUTpkGfnV*Bxr4U0isX^U4P<f/9REtA'f2npRh(%NE%E)6E(Cc..?+-_]πU"N>1c3WA_^MBC#ANt'S4U9ag&5)e]Kow(2pcibwXEedM#Q_4IxIR?C7j(rm*g<CqπU"trLk_2>Ut47Z5BZMp-Xm(5=mfI8>&=$X_^a?tqlTJ87F&<UEXXih3Cj3wQ>;OXXπU"uEx[T/5HbEq8v<Z>KJ5A'knxt;kp0d:oeoY,g<*CBEFk#+,Bdvu+i=TNP(U#%ACπU"&q<KsQI&4)Zc*(.FtHDqA&7lEx'%up&'%W09%%%%-%%rh]F/7PN>%G'%%&[0%%%πU"3%%%%%%%%%&%E%*/P%%I%%C4)<?TxM:D;;LS?0;%up&'%W09%%%%-%'Jo]F#IG-πU";&'(%%'A-%%%6%%%%%%%%%&%E%*/Ps'I%%C4)<?TxM:D;;2?82S210Bu%p&'W%0πU"9%%%%-%r#h]Fg][L_v%T%%,'s%%3%%%%%%%%%%[%E%/,PN*%L%C4<A?Tx:2D;;SπU"2?82u%p&'W%09%%[%-%<#o]FvR<aZb#'%%H%*%%6%%%%%%%%%&[%E%/,PwZ%L%CπU"4<A?Tx:MD;;?DDCS1)0Bup%*+%%%%%)%7)%o%7%%9]%%%%%%up()%9%%%#-%h1dπU"\Fy53%s?(.%%d/%%%6%I%%C4)<?TxM?8A02;4ASh10B&k%T=S.e5Ll'[DkvgzoPπU"CB4=,*M<tU_9=/*6R5Jfj1F=Q'#[WiS=a]T$l,oIjJTMyijaQJ_<+BG1X(.n?FcπU"k+Bo$&'$0Gb+*?geCDL&z%9\v$=f05%=D]$#DH/RUK'8>(l2]u.HiG/t].lq)HmπU"^('-TQOTp.]xCb5_/VLQtTH)n8Qr.wH&13+WnNN(m(SUj9FN%\Je)+v8)>pkcv7πU"(%>,&m+\2/%s8zjZPWVMg]9Y*7(Ed9U#kP:GKRDgd:U,<(S&Fq]kS^TIBQ#nfUTπU".hIc6QQE5apKi;5l+7n(;q$hqCUgEa'tAaK=1g+S1n[l4))lc3M.p*dv8EmY7-iπU"GmADjJ>7;%.tvacmBhK5((EmTNp>wVslLPFQ87,beL^n^%B&ZfrG9*wy]K'&0NcπU"<5a[jfV;Xq,E*&ZR-nJ]TahnKgf;P.w&Yi+4lv7YDd=nTSj69>i%*:bJM#Ru8\]πU"(R$oI8ikxQubPk6X+W.%oZaQ%;zdp-Pejz%+orn;8.4KutB#\2<\J6nHEjEu_E4πU"uqWjp1ef+0R[S[DJ9Q^%N=m$8qRrs\hosZEc5rL8?GhpK^^X-)Y'U19kCQZFm7LπU"p;KW*uJ-HUTGi0]$T;Z%;CGDj<#CjuePO)hI]%1=pW=Wqh1QOYZgP>Awsbo?r=5πU"&29u*EC%e,G(/W5?./HXXHS;LPA'1F6L:mgG]OI8.&HF6f/8.KD%:^Y>DyF0pC)πU"xuYP1tu;i5pvjrrQB=$+x.C<?F.ID-bcSn3JYtMuq[u/$t0oF:Tan';qzqgp/[hπU"Tnt.Q7n..1;c^_wOf6b+Suwi=7F*h;OxaImhPOYv^8?cS#MmMoA'%2^KR9Ue>uAπU"H6R$VocLubF1[9_N)J;Ph(dAhP*EE<a2WDuY)&#A*K-B]w-&*S*tsL+aG#pz:?^πU"_&aF/sp0psSO.<Fjbw0A4p[%eOP6bjbr:sLnQz8d6k:iS%PXZGAT.Fne*gFd)c.πU"/\JmW)^eMx=qE4>hB;>Rg/4hM^jIHOo*\h0\HG=COHfYTh=tif,dABxDY'Z+bQKπU"D?\\YP5+hl0,Uh*A.+2GT9=Q;adC%6MxMdxM&a*w]s/'LponLPpq7>_C2DYuqhIπU"13+Fm,yw*u%p()9%%%%-.%Q8\1F3*q+lm'%(%x-%%%5%%L%C4<J?T%>MAC4GIWSπU"10GB.z,,>Se5tK0]x1UXy+e)hL$/^%9Pc.=v%1wWOYNfrT^T=NQ$mV/utWWl8<5πU"qotgV/JoEM=E>'k.uW[&SBez?^[d6$lr<['wVm=DN-UU<XPh,h;v00kNi1q=6TjπU"D(I^1Tsv5j*,Z/14Ov]nl8l&,=_-Q2l/E.Q)kMY2DrskD^7Nfq#T:?#75^$L'=4πU"4$E'o[Qk4AfbE83-;IH^WJ-3E&ScF=xk:O.'QGE.0?6I89z7QH0N/eQM5Wh5BSpπU"sGN)n5i&ac$YStJD$z?+&Czjzs;\2\%qf1zr2A'VKb7.IEpyWmRQ]YM*#yhRRp(πU"f9Ska8&>ddRA[Fcf#JA+1xECy89-I4A/9j3_-#7ErO9O&5,c*,aTAwgITWI:(uAπU"vh+<I6.w_gezw]NIt;]MgR%yGOCy$1jypYddl;,3A>y7.Fwv;IubNoG6rZs0W')πU"2;d<EpF=SrYG0WjR.[NUjU<ZNS?ICr>UZgMGXJMEu&H,rPlTEw>.?9Cu+u]*53LπU";%E>pornT1N9=B.ug8U(Cw'Yv)nQ;q4*p64KX_BU]nXHN&iUA<#o[iMEr.,'V2yπU"G>Tv1&HV2/^>:uIr;$f^3m3&Jk+qY_BnuX>3eX\rEvDv5QWZ9;6cu+G%AFDD(i[πU"4cdykgVsRjo?a=lw+Tq;RGMp4Cw^.I2Tt=?.F+^>Q0]L;AqB>olc3D>xSA(qBZ2πU"tBZCfxDV+=oWu6<U:ri7R#D#.c-tO%z6A,nK%bdW3$cHcCn77Q#Ql^[L3_K#mSDπU"]O,'*R?qm&yN;Pfk/tpXtSyG(=mSzOVa5THb7i:Gs+zoOO'nwHt*wzoc9?tD9E#πU"e/LS4&ps7F<5ol:F1nr&N%oq9U4bWKl9lhMBM6?:#H].dT.GJ<<+m/C&N&ZB,$_πU"=$6fm(hkUgQoCau]^NiUC/*oc&cMNvq)qN08*KEa(FtuG#i.Pl=[^xU$s3[4C:,πU"zd%dup(%)9%%%%-%o%r]F>E/^Y&[&%%4%'%%5#%%%C24<?TLy8;42A=3SM10BLGπU"$VsRde5Th4\RF]A8YReU?768]L[Vf&yi/);7qWvC?*YTgi83X3W(MGM\%=eX^lFπU"h6,I,D=3PmEBHWA]fjCn#,,m&0]rcnXO^dY<SaHsYpI6:;4<;P^='IVIc4PQDOJπU"W]YG*Q&61p:TMjs/f6=#<I]Nl>lt64+-)Cg:JKTG/E/U^0HF>e1;u=Vk0y&;mXLπU"b_^n/FSOs7HR=bY]$0q$$aC],0gu/s9==Z(T^O[9o%Ax*:A8aPef7nGdUU*1]jDπU"STKgW=Tp_R0U54fMCZ([O(?a.9e/46EEHc3tDc^UgNipaSC=?&ccWNk>vT41.;;πU"7?_*mGi(I#FZB#XxLF7;r]ka-buN[8GRWPQFI071(9x&lKDnH<RldHaxpla1w2[πU"E19-hi5DKuXCW*B>LrMx]Z%*JpWoA_W8v5b)N^h#5?4'#>,6Xup%&'W0%9%%%#-πU"%*7[\F$g/UT/)%%%-1%%%6%%%%%%%%%&%RE%/P%%%%%MC4<?ITX3<M=C<>JAS10πU"&Bup&%'W09%%%%-.%/2[aF.g2(OD(%%%m.%%%5%%%%%%%%%&%EO%/P^#)%%C24<πU"?TLYG<>2A?7S210Bu%p&'W%09%%%%-%)%q]Fit^P*u#*%%s%<%%6%%%%%%%%%&[πU"%E%/&PW-%L%C4<A?Tg;M3?82D5GS1)0Bup%&'W0%9%%%7-%?pd]F0h2XwY-.%%nπU"<%%%6%%%%%%%%%&%RE%/P&,3%%MC4<?ITl85LW1B0JES10&Bup&%'W09%%%%-%%πU"Up]mFerW%.l1%(%EQ%%%5%%%%%%%%%&%E4%/P;#<%%C24<?TLl85<20GGS210BuπU"%p&'W%09%%[%-%F#.[Fg^*A;][&%%p%'%%4%%%%%%%%%&[%E%/)PZH%L%C4<J?TπU"8<M064BLS10B%up&'%W09%%%%-%(XHZFWBVj]'c)%%&/4%%%2%%%%%%%%%&%E%3πU"/PkJI%%C4D<?T:2A03S210Bu%p&'W%09%%#%-%_B-UFw^^UvA['%%<%-%%6%%%%πU"%%%%%&[%E%/,P*O%L%C4<A?Tq8M=4;0AEVS1)0Bup%&'W0%9%%%#-%697\FB):?πU"PR'7%%=-%%%6%%%%%%%%%&%RE%/P&wR%%MC4<?ITu82MB2A>J;S10&Bup&%'W0/πU"%%%%%%%3q]4Fc:s+(E^%+%E^%%%3%%%%%%%%%%%Ej%/P)#U%%C24<?TMB:D;J;SπU"I8&?up&%'W09%%%%-.%h1\pFy5%)s?(%(%d/%%%6%%%%%%%%%&%EO%/PwA9%%C2πU"4<?TLx?8AM0;4ALS10B%up&'%W09%%%%-%(Q8\F)3*ql'm'%%&x-%%%5%%%%%%%πU"%%&%E%E/Pl=I%%C4D<?T%M>AC4AGWS1)0Bup%&'W0%9%%%%-%or[]F>//^Y&&7%πU"%4'%%%5%%%%%%%%%&%RE%/P)8#%%MC4<?ITy8;M4A=3LS10B%up*+%%%%%%2%2%πEND SUBπSUB V4πU"%K(%%*gA%%%%%πEND SUBπV2πV3πV4πCLOSE:IF S=243AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπRyan White PLASMA KALIDA THINGY-MAJIG BigFoot@InfoAve.Net 10-01-96 (08:33) QB, QBasic, PDS 56 2654 RNDPLASM.BAS'Plasma Kalida-thingy-majigπ'By Ryan Whiteπ'Press F1 to makes something wierd happen....π'Otherwise, have fun with this.πSCREEN 12πRANDOMIZE TIMER: CLS : DEFINT A-ZπDIM c(255, 2)πON KEY(1) GOSUB chng: KEY(1) ONπDEF fnx = INT(RND * 3) - 1: DEF fny = INT(RND * 3) - 1πFOR n = 0 TO 15πc(n, 0) = n * 4: c(n, 1) = n * 4: c(n, 2) = n * 4: c(n + 16, 0) = 63: c(n + 16, 1) = 63 - n * 4: c(n + 16, 2) = 63 - n * 4πc(n + 32, 0) = 63: c(n + 32, 1) = n * 2: c(n + 32, 2) = 0: c(n + 48, 0) = 63: c(n + 48, 1) = n * 2 + 31: c(n + 48, 2) = 0πc(n + 64, 0) = 63 - n * 4: c(n + 64, 1) = 63: c(n + 64, 2) = 0: c(n + 80, 0) = 0: c(n + 80, 1) = 63 - n * 2: c(n + 80, 2) = n * 4πc(n + 96, 0) = 0: c(n + 96, 1) = 32 - n * 2: c(n + 96, 2) = 60: c(n + 112, 0) = n * 3: c(n + 112, 1) = 0: c(n + 112, 2) = 60πc(n + 128, 0) = 45 - n * 3: c(n + 128, 1) = 0: c(n + 128, 2) = 60: c(n + 144, 0) = 0: c(n + 144, 1) = n * 2: c(n + 144, 2) = 60πc(n + 160, 0) = 0: c(n + 160, 1) = 30 + n * 2: c(n + 160, 2) = 60 - n * 4: c(n + 176, 0) = n * 4: c(n + 176, 1) = 63: c(n + 176, 2) = 0πc(n + 192, 0) = 63: c(n + 192, 1) = 60 - n * 2: c(n + 192, 2) = 0: c(n + 208, 0) = 63: c(n + 208, 1) = 30 - n * 2: c(n + 208, 2) = 0πc(n + 224, 0) = 60 - n * 2: c(n + 224, 1) = n * 2: c(n + 224, 2) = n * 2: c(n + 240, 0) = 30 - n * 2: c(n + 240, 1) = 30 - n * 2: c(n + 240, 2) = 30 - n * 2πNEXT nπFOR n = 0 TO 15: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nππx = 0: y = 0πDOπx = fnx + x: y = fny + yπIF x >= 320 THEN x = 319 ELSE IF x <= -1 THEN x = 0πIF y >= 240 THEN y = 239 ELSE IF y <= -1 THEN y = 0πc1 = 1 + POINT(x, y): IF c1 >= 16 THEN c1 = 15πc2 = 1 + POINT(639 - x, y): IF c2 >= 16 THEN c2 = 15πc3 = 1 + POINT(x, 479 - y): IF c3 >= 16 THEN c3 = 15πc4 = 1 + POINT(639 - x, 479 - y): IF c4 >= 16 THEN c4 = 15πPSET (x, y), c1: PSET (639 - x, y), c2: PSET (x, 479 - y), c3: PSET (639 - x, 479 - y), c4πPSET (319 - x, 239 - y), c1: PSET (320 + x, 239 - y), c2: PSET (319 - x, 240 + y), c3: PSET (320 + x, 240 + y), c4πPSET (x, 239 - y), c1: PSET (639 - x, 239 - y), c2: PSET (639 - x, 240 + y), c3: PSET (x, 240 + y), c4πPSET (319 - x, y), c1: PSET (320 + x, 479 - y), c2: PSET (320 + x, y), c3: PSET (319 - x, 479 - y), c4πIF v = 1 THEN GOSUB colπLOOP UNTIL INKEY$ <> ""πENDππchng:πI = I - 1: IF I = -1 THEN I = 1πIF I = 1 THEN v = 1 ELSE v = 0πRETURNππcol:πscol = scol + 1: IF scol = 241 THEN scol = 0πecol = scol + 14πcc = 0πFOR n = scol TO ecolπcc = cc + 1πOUT &H3C8, ccπFOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT mπNEXT nπRETURNπππ' -1 or 1 routines:x = x + (INT((RND * 2) + 1) * 2 - 3):y = y + (INT((RND * 2) + 1) * 2 - 3)πDouglas H. Lusher PANNING W/256 COLORS comp.lang.basic.misc 10-09-96 (14:03) QB, PDS 321 11708 256PAN.BAS 'Some of you, I trust, took note of the code that I posted a fewπ'days ago demonstrating how to create a large virtual screen inπ'SCREEN 12 and pan the display screen over the virtual screen.π'Shortly after, some one posted a request to have this implementedπ'in 320x200x256 mode. Well, it can be done, but it's not reallyπ'worth it. SCREEN 13 only has 65536 bytes of memory available andπ'is already using 98% of that - so there's really no room toπ'expand in. In SCREEN 13, a virtual screen could not be any widerπ'than 320 pixels and the most height you could add would be aboutπ'four lines. By contrast, in SCREEN 12 the visible screen areaπ'requires only about 58% of the available memory, so there's plentyπ'of extra space to use. One alternative, if a large virtual screenπ'is needed in a 256 color mode is to use Mode-X. This is what Iπ'have done in the demo below. Since Mode-X has all 256K of videoπ'memory available, you have room to set up a large virtual screen.π'Unfortunately, the memory map in this mode is much more complexπ'than in SCREEN 13, and that makes this mode difficult to workπ'with. On the other hand, my Mode-X code is for 320x240, so youπ'have square pixels and don't have to worry about adjusting forπ'the aspect ratio of the screen. Anyway, if you want it, here it is:ππ 'this code is a demo of how to set the VGA to 320x240x256π ' mode and then create a much larger virtual screenπ ' and pan the display screen around the virtual screen.π 'by Douglas H. Lusher - Oct 8, 1996π DECLARE SUB XPAN ()π DECLARE SUB DrawCircle (X%, Y%, Radius%, Culler%)π DECLARE SUB DrawLine (X1%, Y1%, X2%, Y2%, Culler%)π DECLARE SUB XPRINT (X%, Y%, Text$, Culler%)π DECLARE SUB XPSET (X%, Y%, Culler%)π DECLARE SUB Screen320x240 ()π DECLARE SUB InitCharSet (Segment%, Offset%, CharHeight%)π DEFINT A-Zπ '$INCLUDE: 'QB.BI'π RANDOMIZE TIMERππ DIM ScrnWid%, ScrnHgt%, VScrnWid%, VScrnHgt%, BytesPerLine%π DIM APage%, CharHgt%π REDIM HiNibble%(0), LoNibble%(0), BitMask%(3)ππ CALL Screen320x240π 'the width of the virtual screen in pixels:π VScrnWid% = 592π 'In this screen mode, the following must be true:π ' VScrnWid% must be equal to or greater than 320π ' VScrnWid% must be less than or equal to 1088π ' VScrnWid% must be evenly divisible by 8π BytesPerLine% = VScrnWid% \ 4π π 'the height of the virtual screen in pixels:π VScrnHgt% = 442π 'In this screen mode, the following must be true:π ' VScrnHgt% must be equal to or greater than 240π ' VScrnHgt% must be less than or equal to 819π ' The product of VScrnHgt% multiplied by VScrnWid% must be lessπ ' than or equal to 262144ππ 'create the virtual screen:π OUT &H3D4, &H13: OUT &H3D5, VScrnWid% \ 8ππ 'put up some graphicsπ CALL DrawLine(0, 0, VScrnWid% - 1, 0, 1)π CALL DrawLine(VScrnWid% - 1, 0, VScrnWid% - 1, VScrnHgt% - 1, 2)π CALL DrawLine(VScrnWid% - 1, VScrnHgt% - 1, 0, VScrnHgt% - 1, 3)π CALL DrawLine(0, VScrnHgt% - 1, 0, 0, 4)π RR% = VScrnHgt%: IF VScrnWid% < VScrnHgt% THEN RR% = VScrnWid%π DO UNTIL LEN(INKEY$)π X1% = INT(RND * VScrnWid%)π Y1% = INT(RND * VScrnHgt%)π X2% = INT(RND * VScrnWid%)π Y2% = INT(RND * VScrnHgt%)π C% = INT(RND * 14) + 1π CALL DrawLine(X1%, Y1%, X2%, Y2%, C%)π R% = INT(RND * (RR% \ 4))π X1% = INT(RND * VScrnWid%)π Y1% = INT(RND * VScrnHgt%)π C% = INT(RND * 254) + 1π CALL DrawCircle(X1%, Y1%, R%, C%)π LOOPπ CALL XPRINT(8, 0, "Upper Left", 15)π CALL XPRINT(VScrnWid% - 96, 0, "Upper Right", 15)π CALL XPRINT(8, VScrnHgt% - 16, "Lower Left", 15)π CALL XPRINT(VScrnWid% - 96, VScrnHgt% - 16, "Lower Right", 15)π CALL XPANπ SCREEN 13: SCREEN 0: WIDTH 80π ENDππ SUB DrawCircle (X%, Y%, Radius%, Culler%)π 'a routine to draw circles using only integers and integer mathπ 'an implementation of Bresenham's algorithmπ 'by Douglas H. Lusher, 05-09-1996π A% = 0π B% = Radius%π D% = (1 - Radius%) * 2π XX1% = X%: YY1% = Y% + B%π XX2% = X%: YY2% = Y% - B%π XY1% = X% + B%: YX1% = Y%π XY2% = X% - B%: YX2% = Y%π DO WHILE B% >= A%π CALL XPSET(XX1%, YY1%, Culler%)π CALL XPSET(XX1%, YY2%, Culler%)π CALL XPSET(XX2%, YY1%, Culler%)π CALL XPSET(XX2%, YY2%, Culler%)π CALL XPSET(XY1%, YX1%, Culler%)π CALL XPSET(XY1%, YX2%, Culler%)π CALL XPSET(XY2%, YX1%, Culler%)π CALL XPSET(XY2%, YX2%, Culler%)π IF D% + B% > 0 THENπ B% = B% - 1π D% = D% - (B% * 2) + 1π YY1% = YY1% - 1: YY2% = YY2% + 1π XY1% = XY1% - 1: XY2% = XY2% + 1π END IFπ IF A% > D% THENπ A% = A% + 1π D% = D% + (A% * 2) + 1π XX1% = XX1% + 1: XX2% = XX2% - 1π YX1% = YX1% + 1: YX2% = YX2% - 1π END IFπ LOOPπ END SUBππ SUB DrawLine (X1%, Y1%, X2%, Y2%, Culler%)π 'a routine to draw lines using only integers and integer mathπ 'an implementation of Bresenham's algorithmπ 'by Douglas H. Lusher, 05-08-1996π A% = X2% - X1%π B% = Y2% - Y1%π DX2% = 1: DY2% = 1π IF A% < 0 THEN A% = -A%: DX2% = -1π IF B% < 0 THEN B% = -B%: DY2% = -1π DX1% = DX2%: DY1% = 0π IF A% < B% THEN SWAP A%, B%: DX1% = 0: DY1% = DY2%π I1% = B% * 2π D% = I1% - A%π I2% = D% - A%π X% = X1%: Y% = Y1%π FOR I% = 0 TO A%π CALL XPSET(X%, Y%, Culler%)π IF D% < 0 THENπ X% = X% + DX1%π Y% = Y% + DY1%π D% = D% + I1%π ELSEπ X% = X% + DX2%π Y% = Y% + DY2%π D% = D% + I2%π END IFπ NEXTπ END SUBππ SUB InitCharSet (Segment%, Offset%, CharHeight%)π 'this code initializes the data used by the routine XPRINT toπ ' define the charactersπ 'Segment% and Offset% are the location in memory of the bitmapsπ ' of the characters.π 'CharHeight% is the height of the characters in pixels.π ' CharHeight% may be in the range 8 - 16π 'by Douglas H. Lusher - Aug 2, 1996π SHARED HiNibble%(), LoNibble%(), CharHgt%π REDIM HiNibble%(4096)π REDIM LoNibble%(4096)π DIM Mask%(15)π Mask%(0) = 0: Mask%(1) = 8: Mask%(2) = 4π Mask%(3) = 12: Mask%(4) = 2: Mask%(5) = 10π Mask%(6) = 6: Mask%(7) = 14: Mask%(8) = 1π Mask%(9) = 9: Mask%(10) = 5: Mask%(11) = 13π Mask%(12) = 3: Mask%(13) = 11: Mask%(14) = 7π Mask%(15) = 15ππ DEF SEG = Segment%π FOR Char% = 0 TO 255π CharPtr% = Char% * 16π FOR Ln% = 0 TO CharHeight% - 1π BitPattern% = PEEK(Offset% + (Char% * CharHeight%) + Ln%)π HiNibble%(CharPtr% + Ln%) = Mask%(BitPattern% \ 16)π LoNibble%(CharPtr% + Ln%) = Mask%(BitPattern% AND 15)π NEXTπ NEXTπ CharHgt% = CharHeight%π END SUBππ SUB Screen320x240π 'this code puts the VGA in 320x240x256 mode, and initializes theπ ' character set and the bit masks needed in this mode.π 'by Douglas H. Lusher - Aug 2, 1996ππ 'begin with standard 320x200x256 modeπ SCREEN 13ππ 'change the CPU addressing of video memory to linear (not odd/even,π 'chain, or chain 4) to allow access to all 256K of display memory.π 'using the Sequence Controller, select the Memory Mode registerπ OUT &H3C4, &H4π '"AND NOT &H8" turns off chain 4, "OR &H4" turns off odd/evenπ OUT &H3C5, (INP(&H3C5) AND NOT &H8) OR &H4π 'using the Graphics Controller, select the Graphics Mode registerπ OUT &H3CE, &H5π 'turn off odd/evenπ OUT &H3CF, INP(&H3CF) AND NOT &H10π 'using the Graphics Controller, select the Miscellaneous registerπ OUT &H3CE, &H6π 'turn off chainπ OUT &H3CF, INP(&H3CF) AND NOT &H2π 'clear all of video memory (setting mode 13 only cleared 64K)π 'Do this before switching the CRT out of mode 13 so that garbageπ 'does not appear on the screen when the switch is made.π 'using the Sequence Controller, select the Map Mask registerπ 'and set it to write to all four bit-planes simultaneouslyπ OUT &H3C4, &H2: OUT &H3C5, &HFπ DEF SEG = &HA000π FOR Ptr% = 0 TO 31999: POKE Ptr%, 0: NEXTπ DEF SEG = &HA7D0π FOR Ptr% = 0 TO 31999: POKE Ptr%, 0: NEXTπ DEF SEG = &HAFA0π FOR Ptr% = 0 TO 1535: POKE Ptr%, 0: NEXTππ 'to reprogram the CRT controllerπ 'remove write protect from the registersπ OUT &H3D4, &H11: OUT &H3D5, INP(&H3D5) AND &H7Fπ OUT &H3D4, &H6: OUT &H3D5, &HD 'vertical totalπ OUT &H3D4, &H7: OUT &H3D5, &H3E 'overflowπ 'select the Maximum Scan Line register, set it for double scanπ OUT &H3D4, &H9: OUT &H3D5, INP(&H3D5) OR &H1π OUT &H3D4, &H10: OUT &H3D5, &HEA 'vertical sync startπ OUT &H3D4, &H11: OUT &H3D5, &HAC 'vertical sync endπ OUT &H3D4, &H12: OUT &H3D5, &HDF 'vertical displayedπ 'select the Underline Location register, and turn off dword modeπ OUT &H3D4, &H14: OUT &H3D5, INP(&H3D5) AND NOT &H40π OUT &H3D4, &H15: OUT &H3D5, &HE7 'vertical blank startπ OUT &H3D4, &H16: OUT &H3D5, &H6 'vertical blank endπ 'select the Mode Control register, turn on the byte mode bitπ OUT &H3D4, &H17: OUT &H3D5, INP(&H3D5) OR &H40ππ SHARED ScrnWid%, ScrnHgt%, VScrnWid%, VScrnHgt%π ScrnWid% = 320: ScrnHgt% = 240: VScrnWid% = 320: VScrnHgt% = 240π SHARED BytesPerLine%, APage%π BytesPerLine% = 80: APage% = &HA000π SHARED BitMask%()π BitMask%(0) = 1: BitMask%(1) = 2: BitMask%(2) = 4: BitMask%(3) = 8π DIM Reg AS RegTypeXπ Reg.AX = &H1130π Reg.BX = &H600π CALL INTERRUPTX(&H10, Reg, Reg)π CALL InitCharSet(Reg.ES, Reg.BP, 16)π END SUBππ SUB XPANπ 'this routine allows the user to pan around a virtual screenπ ' in 320x240x256 modeπ 'by Douglas H. Lusher, Oct 8, 1996π SHARED ScrnWid%, ScrnHgt%, VScrnWid%, VScrnHgt%, BytesPerLine%π HPanLimit% = (VScrnWid% - ScrnWid%) * 2π VPanLimit% = VScrnHgt% - ScrnHgt%ππ X% = 0: Y% = 0π DOπ DO WHILE LEN(INKEY$): LOOPπ DO: KP$ = INKEY$: LOOP UNTIL LEN(KP$)π KP% = ASC(KP$): IF KP% = 0 THEN KP% = -ASC(MID$(KP$, 2))π SELECT CASE KP%π CASE 27π EXIT DOπ CASE 52, -75 'Four, LArrowπ IF X% > 0 THEN X% = X% - 2 ELSE BEEPπ CASE 54, -77 'Six, RArrowπ IF X% < HPanLimit% THEN X% = X% + 2 ELSE BEEPπ CASE 56, -72 'Eight, UpArrowπ IF Y% > 0 THEN Y% = Y% - 1 ELSE BEEPπ CASE 50, -80 'Two, DnArrowπ IF Y% < VPanLimit% THEN Y% = Y% + 1 ELSE BEEPπ END SELECTπ Ptr& = (BytesPerLine% * CLNG(Y%)) + (X% \ 8)π WAIT &H3DA, 8, 8π DO: LOOP WHILE (INP(&H3DA) AND 8) = 0π OUT &H3C0, &H33: OUT &H3C0, X% MOD 8π OUT &H3D4, &HD: OUT &H3D5, Ptr& MOD 256π OUT &H3D4, &HC: OUT &H3D5, Ptr& \ 256π LOOPπ END SUBππ SUB XPRINT (X%, Y%, Text$, Culler%)π 'this is code to print text in 320x240x256 modeπ 'X% and Y% are the screen coordinates where the upper left cornerπ ' of the first character in the string should appearπ 'Text$ is the string to be printedπ 'Culler% is the color in which the characters will be printedπ ' Culler% must be in the range 0 - 255π 'by Douglas H. Lusher - Aug 2, 1996π SHARED BytesPerLine%, APage%π SHARED HiNibble%(), LoNibble%(), CharHgt%π DEF SEG = APage%π Offset& = (BytesPerLine% * CLNG(Y%)) + (X% \ 4)π OUT &H3C4, 2π FOR Char% = 1 TO LEN(Text$)π VideoPtr& = Offset&π Ptr% = ASC(MID$(Text$, Char%, 1)) * 16π FOR Ln% = Ptr% TO Ptr% + CharHgt% - 1π OUT &H3C5, HiNibble%(Ln%): POKE VideoPtr&, Culler%π OUT &H3C5, LoNibble%(Ln%): POKE VideoPtr& + 1, Culler%π VideoPtr& = VideoPtr& + BytesPerLine%π NEXTπ Offset& = Offset& + 2π NEXTπ END SUBππ SUB XPSET (X%, Y%, Culler%)π 'this is code to write a pixel in 320x240x256 modeπ 'by Douglas H. Lusher - June 15, 1996π 'X% and Y% are the coordinates of the pixelπ 'Culler% is the color of the pixelπ ' Culler% must be in the range 0 - 255π SHARED VScrnWid%, VScrnHgt%, BytesPerLine%, APage%, BitMask%()π IF X% < 0 THEN EXIT SUBπ IF X% >= VScrnWid% THEN EXIT SUBπ IF Y% < 0 THEN EXIT SUBπ IF Y% >= VScrnHgt% THEN EXIT SUBπ OUT &H3C4, 2: OUT &H3C5, BitMask%(X% AND 3)π DEF SEG = APage%π POKE (BytesPerLine% * CLNG(Y%)) + (X% \ 4), Culler%π END SUBπDon Schullian VGA SCREEN SAVE/RESTORE FOR PB d83@hol.gr 10-07-96 (17:39) PB 301 19851 PBSAVE12.BAS' Load/Run under PowerBASIC to extract PBSAVE12.ZIPπDEFINT A-Z:SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"PBSAVE12.ZIP",4^6:Z&=14590:?STRING$(50,177);πU"%up()%9%'%R-%/iIiF9p.=0Z)%%%w1%%%0%%%%ht%rufw%wSirOt&%.,>Sm5tN0πU"]h7UVIeKG5j_9-IPk7+TM2j=DES*]CTIGg=O/b3Azb?PCbsPysC&Wbmk?UwngbQπU"mj5EA<Unw/)Z:.uHgEul_h]BSVhI3p.?vp>8fs8BOQLIa<=2<r,iiT(stom=-ltπU"wT9Y57p].gxYHQ9.a4Qi%p#O8P,Jn,&U[rbDgA-+GXf(PFHb]+\is;no2J4,P/:πU"_)rNI=o48D=Qkhf$=(9d='0X:,TR[4pLHr'fm$9T$d8^oMmJ'OSiXer.G$2f&rvπU"iQnwiXO'%$XqIg(k)'^iK&poLu7vpoFVOl]oozP7.4te-HH8167U-?6;SblMJmkπU"#N=CEojd#?#U<8U[E^Mll\S8AE5&0Yv*WhDTO*bwd.RE3sR3fF#].4)vVtYGX;mπU"UA&+6k:35g348,?k^jCDSRT^NpofeHVeAj(1cjlXCT7ak4-hheC1jV521>?;l-lπU"M$N_J(KbW5RM-t\8>D:j\5Y3%whPtSLnGg=VQWRS/WMnGQX&E<#])b0X[,X&:I3πU"4ZI>,(Pn,hLzrRTbIM2j?EZRA+j[K=%z+s$4?KN;(G#s6=+]KoLR7Te,,HC&mh(πU"7LD&;2gejTbQ+zBH$l/cHY$<osMY8=:]]%sXL^Aa1D[vR^QAC.qd&#oCvAs6/EiπU"gRq[mg1+QnAy/&?Y/r2S&;Ugn3uWNBZSVCCiJBiqYa>Be$XU/mh)JE#lrD_zO7#πU"uG^jtlq+m(7r>*0UO)Y,KXj^(:yIH#pL_#(u2DsnyigfWM4bC;HICt8:tdns;+BπU"ZQ*4U<?o3OTg1KzDA+7HnqlTH37KSMBD4cNu%wJ3J21:EaFf%k-%pc%%4BD5uMCπU"<B:i(uxm9'bLo*^JLO:5tPy57-MeM&wY+Q'1t$G*Nz3+q$tLj*nc8I5<B)/ubNFπU"5y7J4G$RKuUksA2BeMx&7CWV1AvugR1nMT0d3rg<EM\BPoR3_uGkX*M,X1yW;LwπU"B4Un4Q[B?xH]Cv7Nhi5FmNi-sN)q3EL^a<JF$78%:?r3>GqR]ps:2X_WJigv0WmπU".(CbC.>2=O,ps>=Y5[g+a<k\uK29NVW2+]\#/_eXxTY>3+.nrTobR3&Mkb2ri:ZπU"dJZiez=O2:joFEBp#GjQRr]+&&$Rqjgr^]VBXBD_]h4BfB2WObJ5M<a.n[nZ<IPπU"XB3iB3chJQQXaV_fHbHk9[6K)1R4C>qoXhUoN^Y[ON7W]ThRLLCpFbFoY-uUfHWπU"'_f-P<qjDz>A1gu^^dxuZ4JeD<))sS5eS#RlT$9-_a?a\OZTEhQ$p+U2pFJoAy(πU"tfO_^>,U0<6eW*W/;e=8\JF$.lF6eM6C=2*'xnGQL4V1okh0\9wdjZiK_(I.KckπU"'LP-qgqm8Kjl;61V%Q\5-0d(E:6B^MtaQLNe(Ej;9aDN=,aMf>E9&/cjSDiQ'[bπU"$/t)D2p7+NR+mS-4&/#;b6-YDRT4-3u>x-VGUoCvYj$2+',Og]#9Dpid%up()%9πU"%'%I-%0e.iF,l)Zdb(7%%c.%%%1%%%%lj%yuqf%sjSiRrtFd<X>[k=5#XR<rNqOπU"0C:wmKG+iUdmz3iFK$/[J4#t&Qn>StA'Z[)RTfu,s^.KbkmSbs_cVop?M8]CC$:πU"Ec+0UJwCODQpTnWlluHEwiJ0aQpn:Ett<v-t2tJED_t+-%9P8\uM&+xoIWl5\/AπU"*f[aGjpdF4LqLl=sK3*cwQtnJz7;6NLTWNdCpgFi_Xi2)tsF$4PW^q-\AUN9dofπU";d<sV:6.3[aUT(aD^QfBTTVCW=dE,ZF?q<VL$omaX?'No?PxR(Y*YIapAa]oz$qπU"-Ah3j+xbZA-*FYG%Vz:bZfy40##3P$F3k)AwFt;GclFf[y5ils&]LYUVd)t]tX,πU"tL1tdTg^e,>poRjhGim'4BkC=V^C&C?ujrCta<#$hJckPlp6-9ZGYl7cqko=_a2πU"=B.-H$rL5tWS\W;=?VQ.D3U&h6+EwRvk_?t%HQk&=?)U&v_Fqq0D*gJfN%TAUS.πU"Kvka7P1vWpS7SF&-yvhMtW.*&:[_d.Tk5S]:8cZ\xi[SFuA1Q4U0r;Ga$j+^_j1πU"1%u&(Z,v5,APbeU>Clwo<FOjA=CTS&nt(o+UVQg;Y);*V#22lO&b&78+Uz^O7<dπU"UqQ-etSZo]l_pI58NaP/'9hTlIRa:bxJ4,HAV<FAlMvo73\u%<qj[/o+;^XT4CTπU"uA=3OSAYA5CwTH^[KAI)E2cpHu^x7xm3B0V-bT1,lp0#X.24CRk7t[2pU:3OTg)πU"35s$V^w^Mjr,lR%K_J9MpMfSU[N[Ke>^qbUjLnxv:PD7k?9ELDAfDp;y83gwKw_πU">%#X#[PzgFz-SyNq9;g;u#(k$DiE8L;kvg*#AqpgY\s]FGNZ,?4]Kpqqc(a^1aVπU"o>Q^J26#-?\qWqP/Rg+ljOOcDk-:lB\K=&eI:+]Io85AM2qjD%P[Uzccr?2hAX7πU"_>#CSEk#qu4/CmswWe=&1rJ1KbgS2ZTH%o.x)o>C+S[+h\&hJ\=K5gdaowVCQsfπU"K3u.E-ZnL-d<bNbV?]h7un;WWNkF6&B0if_Vz>J]q)e[3c_+D;S<kl.8[;B9Jm^πU"0-96wP9,#w(u%p()9%%'%-1%(jiRF4UY&eB/%+%bA%%%1%%(%%lf%Wknq%jSir4πU"t.'p>BTA6l7,Yx&phv[B20vK3a0HR)&PIM&0j'Qp%a^UCEAMq%1'/Cka.NDMxs9πU":LtXzABkFzJTCTR2*36U%Vw&-:#,_-kZbw3v<8mg>cM6*-nz:9$CdnDL0w3^a6LπU"iUj>LNO,P?V:Dd..0w&)-1z^$+I>EhNb;]YD4Q+i%t%WxKUz986YEl53\5ED4'lπU"2RR,?*rSkBofZvWuTc-0TSb-iMpLQ$=cO9u#L?omgBx,s'V?sqlq2?kl[/GxlnDπU"l$7XowQ0JCL5A<=+/iHexhhJ=o98^vd6TB1fm>t[r*bmt--t.8utQD0GM$Z7t3ZπU"otiy\d_0_NWq)xV%-/M3tEN-j,8L4+dgDQfeI[Q<R$s'eo&yj2-P2\5gt;xqP$$πU",S8=8OUKf-'LQ4neZuu5VCilJZL>C0$=+,=0\R=G_6G0>GgT0c4(UF8<m;v1S.sπU"g?(j-('9?_IP24\3T*0SJgY*oQpe#f\s/=;''G+;#-,*'N>kl0BANj'#**.=;0)πU"EBafAg8e[WtG7HP*avDxI<r.qg#XNDXR<ClFR6%D-;u:<=3#Th'-:IvHatQYq*oπU"<KZ6_wSd<VZ'lJH3b&qhQo&+T%r1D942kgZQUY(cs7bX#;vrnp,TXxoS<?;21rQπU"I$$9C$ij's&p65'9Mq8hAWo]2I)wolSA$QCVV=iYG_s=^)=92B05Soip9vV'F1YπU"_Y?^4W0kb3hPk#[-fKDio3DgV#0Pmr=0A92E%'t*keDAz:+8:-\=:=Z5DH1AAZHπU"\=\=7KYm$Z16,5S;)GJl8mSTT9r;FBvU(E'4ma^k(IK(M1fGuY';Q%H.ul(G+=sπU"$'QS#;Sb1DA'ePl%VIPfUW>ZQ#f5Ka=NKZ3#-#]Kk#4eq=)\>o/mkzU+sY/<Dt/πU"Mg;^s9jDiO#f]S++GQO-bK:*H/>huR+[L/5c9+64/HkA:Z:[0;F1DZSF0k?ZV,aπU"4^5bIM9ufFpi7m+IaC*A$j6Ip:YA=*Wk'1l*4/B&<P4HERe6C_0z(W,Q]H+F\aYπU"4q[O2j1ugO/EG$\h8(3fEr7n5Ya_mNLK6%<,krEE=B<jQb-wFWi)OG;V,[6pN1CπU"Z<O[]fxm\ZjG6I*)IEo\*li/u*9UgL\SPSXQR2G?LI+E2X\r]&hU>HgR6xsAL[BπU"[c:6sJN:Tf5$4)6YK=wa&I6_r4Y3Kd9rQZ$>&Q^g?RGkMZ\_b[nAI=^*IUktaT]πU";ia':>h')9R>dIXONIRq(_,Gb/_E6m'7l%L->#y_9-4hgc)rI.'IfSQ[_fa'P10πU"PQAT54-#rB&s$5+Xg^+2Z1PU*&,cELG^21G*k_Vsh5+&urCV]LQEEJEfE$zC(cTπU"Q+M7.u*iQ65plllU(4w-pJvuMvN&oMumCfpN/u1K=hHf0Y0sR9YQn*=k#eRd\GgπU"vD:iMEVS5/%)?J[s\PVrj?)gdQU&aBjsLMNNu]ElEHMNR[Lo6KKK=Pv-8nn\x&QπU"7(pL1NaCzdZ:Q'%FQN=i=8vH?a]si,2ydpc7&$rx5rL=Ob/B<tSv<[4Z)3SsX\;πU"C9RFA[q:U1an$Ea9$Mp5z6C?iW)WnI6u(ev2rh-w.;nkRUMstYSn.x;B=ELQNpbπU"C9VZ'Y^LI;SXU#ec:;?79F7A[%g$H0J?eVZu'P=>MXB30AmbK4kpI,s/vXRgd7=πU"Vs#:.\D*6lPHwa4:Maqplg$:M.6B(->*lKx^'XiIi6R;F)i:NWL6R6RF?=4tbktπU"TMNeSR7m$o-NVuVV+)F9Sfp/Rq7D)TEC79Sz3m8u5Sh&pC/fJ*SI;[3yl\P)6LGπU"%2xp\RA].D'\-N;bh-vtF&RH8WCib5:8fAx]b^QK#+<$n(%3;b+)/JloOLN7lVAπU"NkF^V='Rj'Dx=L6Ap:ug1c?#xbj&Ud[lS\QFj1t1W'jFd=.IGMz%3+\RuWmEIK2πU"%ABl=)]S+p^oMb5Of7xEc;t1M3tAL2^'.p.vvCW6K&Ja\(*tO7_tObPm%Ap-rvaπU"2OZ[)_Dt3T*,l_x=TM/LS6BYQM>7;Bs942XfLHvNjPi#-*6O'J=;t2cBMsX=;%[πU"-tN^kZzDL?)iKNwy41=rUqhM,kL:[%##&g2KouGU(#YsAUQ%aFOz]7*nOa\&-u&πU"J3$T/u]dox,w:j%FWPU]/%&2:RUjs6irn^D45YGHn^,0E=$DIQ4zmP^R[R9xcP+πU"EfFNVs-V]922<MC/R*FEqp-\#G,]Xp-t7*'%F8;blNB)_$^,0R(hTsgxts$mmXSπU"rhuJK#i;mixR.4-+P9BgZ>L;^))58]n6.6>p_eA_:U=]UDSC4IC[O&oqD]5=[/.πU"gq%gVx/2cfF0C6,02QIEyiD[:?a56;hA4LLy8LwxfX;t5iIMj<_=#&Ur=X4Vw>vπU"d7weox)E=9b,V2Y*>j-f.Z2<GCfBb3F4nrX7oYjRF8$Q3<^Krh]blVc=Q]9cEMvπU"UBXI\48fLB>N6<Z.9gCf9C*^yCnP\r/(9WxEOh_=6I%wI^HyyR3U*oGMt1GYo*\πU"[MIzu*y3Vh[=gD92nabiUAC%^rBL/vUrD^T\Rq2zWaugl6BqF4/wF[vY<72[+KkπU"(&kal\jllY..;&>%&5aHuV4&s7p-IZp>>4j;Gh5&quNguLuc[:g:Sdfvh51_t9JπU"xqa)PG=Y<2x?qEJm3E(eNMIvY:D,nXvk]G^LA/tZ<hg^h5dOAhok8xm5\g#=Gi1πU">8cfB(B/hM37<c+WudJnC#snX_6\%hV\ztl\#_Rs2V(Jn#gbLN4tgZtCTZouUk.πU"*0f7s?jRJcak-F=F8pHtGA5n,k8^MmG%b/QVCD:qc['<LT.^5p:xhM#E4#gYh+^πU"aD/v0J??,25DC/_gr&nS[#ok3\;4j3'-L#lR=]bXxwMdx(w3_.hm<nphqI6I;D7πU"JcnnLJ)A=-(mVN]_DgUKRWBcAn40EHCPU7[e6g<Y,*3aI290:HkC\Uib8N%(43JπU"Ajh7l,RwXO[7k3L9i0g2F:Mob=;A6LhDhnhg>w$uqSs9_H;=cA](9j4(8ot+5u=πU"d;R196RG.TSq%K>zC3n8?V9P8Mkq5Z.Mr6Bdbw5GE<p\=3DvZ=#J4SO4DPDp1N6πU"qGDtuEFm,(#jgDr_:)U.O;l[t6.5O?E?rRtHD:TxSAZc7/t:Q]^xcy71,Mc5LqXπU"b>%vE?>UrCG\9l4b>&z^kX*h5*/bD,wX<[6_g.h1eM2(naRfe&MYGjkhdc5Mw^qπU"5bfp.Sz.t=t4=/4?8F-,G<4&5u.ES%MFYD0MT]<Hd#eMc03#nrk8]g5+r+M:S5>πU"FSr]1da/x8r)$x[JY\UV9-^8up%()9%%'%-%(EfiFmS%Ct'u'%%'f,%%%1%%%&%πU"lft%stkk%Sirt'&zrt]Tq575*kN=Iu5oU%MNwPFMmz?QO:\(alj+C]JI0*U?;],πU"O8^FtS9J=pgO$I[CuXxNs.#GsO(l$o<7W*GcfGalTEX,:,v]DhazP%fWHC'L8V^πU"O3RlaSx$4e&$Wdd0Y:.87;8OkV2q^4*xsZ49HI>Z$:C'?Z.BN\j7qS6\A#d>mw;πU"<;5xAm.;4n3XR(iNy:NkD%i*Xr9-;='-7ls52X%a$MVFUo2HPnZg]JW1'X++d+NπU"GpTA/22U;\UF%0\W8VhX0HCiNyKEf5;#tO:E4.x9NuTFnhudP)DPSf(8$x^tPmoπU"aatQ#3u:rDdTPDJ_3=G.hfl)3nu+q]8[SVqUV<p5'54:V,C;%z83*55f$3Q%M%pπU"?b1VBUU;#7Mxg:C^-puFEH5>1c::0?[5+A?&01HTk_35Q<'Qx,YZH5QTlQBjDwzπU"A#C>Hb]hY/4nGxTYBZpNm4;e#+&9#[]MJSM[t^D?&;#db#]+f?v%bA9fm+GG(eUπU"N-I&jX%327,(w%'Z0:*q.yNJoI07imcA>1Sd'smQmIntF/b4VfY,?COt<7kCU^9πU",Pi%92f'OH[0rn$QFV[gU(6&Ed[57lgC*M=Z/TQ=*.E+0I3DgrUdG^mWhOJ62jqπU"ZllXM>xg37KI.7&P3Dhx]a'Uz..y?Y6)T^OZ^-,\KjW-'&_b0u-.]'G]Q?;ad]3πU"RC\2;lj*)_W0eci$Rt+,J?C(GC.^D;r#wTIZggQeYpWeCcHuxg3=Ap1TF7wed98πU"3p&)v&Y,kmdG4l;E;qMR+L[u3&)TE'0dHZQSpAHAC-lD;L)2jKkBI+;D(,l:KAOπU"5SghVF^&(#g^;<b$<wZCInRUof^fU/TiwQBVNdCsN,e%.w_Z>oGy6DCwmldf)vjπU"Ij:^->FefffYFlXUN3:'%d/pr=GEB1kE*N4dcdNZ.'Cv4dsqcTZs=&FuIM>P)s>πU"W(\-YSB0dvoMb5R'D-WdEa.%up()%9%'%R-%KddiFi+(oz4'%%%q'%%%1%.%%%lπU"%fWkn%qjStIgoD$:f7Lu==#8I5<S4#0LBVQFi*-2bYFf*ZASSEsq/'%aXluS)z6πU"rBLG[]1-bkeKFmi]4Pv&RQ)q8*N?'f+o3/(0#1C5hh4Q>O1^)VI7r-GmiscqwhuπU"pwXxr\tG97eQ[Dq^Tv;*^gT_#68kLZgIQG0iG=O.W.?LppPprFx2#;s&X-(G,GbπU"BB9*%a:GG24/k&.YS0>Q=dq+QXQ%4fSBFsa+He#qFA7O=lDmk/1H$H%fd;t0*+PπU"mt'>O^%205TWL(p>-a4t>6u;o6wM0Yl#+DTlmoaZgCNVcWk+gt#ZC*TChR/=xIiπU"qPt#tlu(hmL+xO[gy92Q%30F(&L>R'D$b?.kJ#[pN2:\s1bD1KVNI_[3RzhkNcSπU"i4bh3]*A1yxU5heAzpBOX5pK[SRtI+b'i0yh<(q2z_VC4(C<E)(7\7tF^^ziz9)πU"ZR:mQI1EOj'AK6iN>pTd=?y21;I8;mH=M1fTqxhjvQ;7m(:w0A(CQr4w^Mt9*q^πU"n_,#g*agb$X(HQ'HMl07&Q\O_i,=[zl3_NRQcW+IW7iDJfWgutWHSpAWa1sU-tDπU"5eR$6Jb#,c=&n5Dx'$Y-:v?MIl3]^ivy/lIOvr&D8/+?-RL;tz0n0JRYz#b;5BtπU"tPRB\?Hpb/;0T_\Kr_];\&q8fIIA#EZ,?9Hj.xhq%<up(%)9%'[%-%\#wfFWSIqπU"wS#1%%X%Y%%0%%%%h%truf%wwSzRsy^)_*>##^:M\Y3x?Y+)$SwO%nnkRB>VMaWπU"*'IsOeC\ldEUU4u,[?DtlFG%jI_>2&7&Le,_Oe#DoMM_kvuami&B5o?7,5IOgToπU":RM12B:SBG\Z$/tmodelw:b_P4;>:(djhFD:h=7GOSh33?;LGIk:saFDo,*6G\cπU"^GtTw\,O08=3ob-(&wY)(Nn2_0f*ZDI6iC07bKqG[85\egTtsLqv:qMz2X/;nxVπU"u0PiJ5/QVvE$8D8'#tT_&b.AaU#,;j=qBRWutxhXYd'0Ai^jST_??[b(q-y2XH2πU"ng.4x:C_Hmpu++uca^UiU^M%$c,P.<u&-CfsSs80D26D:1[+*r>wA^7s<q?L:YZπU"[RR?rITWqD86Uyu\ov4YN74ZWd:><ttR/\jL2Lpug''(aI0\KgEbZj$-N'4Xb3PπU"4JZEsk&Rr)&CL30/#c*7U;3xfl8KK_Ygys?J2hCmsCtoXIT:R[$*)r;chQP>*5TπU"d.NLcI<AFzOswnWgX5*q;NMbNu]r]s-kJA1kh/=3Ei;Um\%'\6j^bJ.cj[/soY7πU"XGm4+\2xP8T,iA7V[ViA%sxKS*l0;^V]c*Wi1OhUB5%)_MOr'ucMvoW:<B[<N.dπU"UP0At'n*BixvlS9&d9aZn*]k5*R^;ZaTiX$FA.P/Pl7Q/4\oqHEBRZRCBnLPMIpπU"k]UvJaoLfZEPX^1u*gx51L?4PNJQdh6,-]Y3*9dG;1-X8Yx=/F>$,44$2+SD(IjπU"B?V)i:MfQtTA=u-f/*0X<.#pIoXo&al&p(mM-&jjif5(?b%.a.n^UFRYqA>M$.2πU"YQtB^L:e:wwAP4cch_GKB*,992Ze\;7-2o&9#,4JmW4E$$TsEqRGv)Bi0:m'O*;πU"*nplRtyi0l9i588M?+8\gf$$<FGb'uiFL#o/+?DUDO=4E^Vgts?Lo:L_RZb&2%eπU"lutl8XR-Z?u&i6MFQYhmZrq6rg^&/a',(4GL1WN$SlWonY#J;In6=TwI>gK6=H*πU"EolXC;4+aN].FHIN2+A^:a*[7MEOP<bjq%u<7r;8*R=Gg0<OJ;^(%ur:/Pn7RT+πU"6GLKbkPQ109hz<H,7o8KT7G\MfFIkvRTm5bY(IF2AG?UuY&=PkaIh[+moplRb:hπU";sQ=$qMkk-#1'hS5$F,v0'KBv0-g'd0:m=%wjs8<twA+-vp3>IiV$8?Bq5kiRPpπU"AzFXs[&Jgl,V(Oq*Wwo0B%^.X7JUMV11SioNSqALPoZ%0Ek)XyP;AsH6+7+<KaBπU"8qslj/So#l9vgP^R<:a^VIQE1Cz#Lj:h,t8K''\Dw:qMGtf*T>oOq/tr&HutK,_πU"b,D[tTMF_sF-SqSF)FV(r7c]lGvuxkiF53,uNcc/_<a3Cy+1x4'B0(A'-Cu/vi(πU":J,gEbNs#x%GA:5\G+3GcQ7ieY$RS+'8?*l^4UX*'c,%MM-Jq-^[TIveDTcTA1xπU"8RQ;w3kCrn<P2qN>$Y?#4tLQR:^FTp4Rt0^oxyIvV&=f'XIj*deSzf[a]8E-$Y.πU"?'=YG0w7CZa7P]EePM_-14]^4QTS3YpY&6M5$'y8*-)*saOE3u<#^d3<b[_'+)eπU"O3bJAG&A#S2SirOdOIa^r3fOM3I]1O%[)#e>8#Zpg)>iGlADC0Ut+9e]s18pw)UπU"0Ccf[aVlwT((DcCFFz=ZLxBt=k^,b>OZ1PbNKZ;EvJO&U2m;_,?J#en6?XxnGabπU"bT4$IjAmq,ouC\,A%&N%H.^g9t+Tatt;I9:]O711&V4tUQ*GHw,82I6K8-iJtVYπU".51==(akD0WJut8JRlLajX]Nd0a55?*%eH(gKz3H1SRVWzcDB:E-h\T-PkKhJ9mπU"fbH7*jMB.k_5qFCj:'WDS-JR0qp%1E7V[dH)TH4t6RQ#]7:-+iM&l_N&tvBi2K]πU"n[O\m[v-9BZzuK+sD4mG,8$2#N^M:f)mY,XAmQCTcSb/4F.AczA^n+:a6SG\U<AπU"K_0MNL9N%SotIcBSRH[Gd,Z0$lFj;g)4hPaxC*4;%nS&O2T,>4-T7XG8bE_qAWMπU"JNlI']Xpl\7s)?70[Y/J0Y\eAhqTA:q+r6ndo#KGnK:Gk=1hv:b5;ZC/dUM6Vs[πU"A&:tX0iAX9G\b#wyGi+JtaWOM*NsOES%4;x=]/u]=/lK7N9BU/EAQhL*abkR&GnπU"s+?6E\=#z(AlK:.[;>'?*NPRUD#L0%*qL;RL'/$gIjsp_jRd/X4[Wn\P*F5$6UnπU"tiVQ4*]OJhr%(_/9FEG;cz/FMm2EmT>6Tl+jy1YlB1X]QQyMgSs,5ctAg((M'$5πU"v.&fuC$OfGfqNx/-O=j1NR^Y;5i3p8GW7AO<A<9E>GX=k;8dnELd2uZ'jc,&b_^πU"<St\.9h6W/#:IQFgaVOnOCP;PFsRFt:bVA'p5,-gt;0T>%HsH,f.UA^Te[G<('JπU"cc[kXep7PG(%3l_YaAgi)qL4oxf58_O_[K[i%%/[-o]CY?7g&&:I%9BUrJ=kE+rπU"sO92.i_&zI,\/5No3ZSJ)fD[bRY%9DPCTqY*Ur=p3UwGwk5ia[4:6(-GXAO=7plπU"dpWvxKXb#byp:x:5z'FNPeW(I)kH^EL=V=s>$>,S\zhR'9fo26:KfS*)qj%:;=BπU"jyS:az^#EGl_%k%b)G)G8&t6E0nZiPY;6?hCZ]^V?Rv9KKA;bLlKIrbq/Nuc(BCπU"Q+q]mVp(h,#65Jyf:%)[)$O+$?)g*8\-^fUpsh^%eTTPYzh#RxqPbw3+_Alkl1YπU"j&yC-,lIn0l3:D5M6GZ0j*xC6zG.',MT+q*,A<m6:j5IyyIOe&Du3==-gQf(3&TπU"U9>sObEGt])uzLYYfmPx^yJYi)Cng5QKd)+B(^7o3Lus[V07npiQuKc\0ydUQWvπU"yn2d]&,q6ZQ2E?3G8?XcE;B)E[j6J.&y4mpa5H$pnfBEyL'KPeg[Y>>6#6E92;nπU"xy.23SK5MQl^<P-LJq#22<kMnqoq54^)'djZsrh9TT\FFiBD8?cX[%*'8>h0cV1πU"#=_?=4CZ0^u.XY[npx14?VmU8AMRGuCMc]c%imle*[*QrBZiZN>CJTCs&juuRJmπU"t\)8j$*GOU_0q5(Dc#WU:P%V^iStla'^mpxx_D*/x]BS\TN2E:gjH(Pzo7r.O?HπU"E1C4oN^k;kHoieq/c:#z6BI^[tSdb#Gg7WHj3,z)J8igHn=GnJV0KN_sK_)B/_KπU"PX0X]oKFH:g.AL?t.\p]C1bN(dcSt98opNI(qk/uvGTJ:&I\gbLqpQgsKPNq'.JπU"h-17\;_n#];hb+GW4/LHQr'Z,$[YbgBT6h[*9D9XH^:iY#0>Kgf+.67F7D_7yzUπU"66e[31jl1Jxp,bhUkrV;m12JUff0?4p^,:LRmP+R<UrvMjL3x2UCC2f8-Wuad66πU"owHX/\1.ZuMqY,0n6*q^&_vS5VhzNelJot=%>CFx\,nJ<wT%1\N)>FNNLhS<k&8πU"g6ov.&*m&;<3&EtBWwVIYUUOs'S9*C(N*QB&I>P3QeW+.G:vm\7iP;dPvRcvaa]πU"V0rh86.u7AB.CIj]84j6p0*1+3Yr/qQBfF\z4_5540&asf9Y6HV&#l8?k5;NhI9πU"7VhC=0)bE:<<YgnSkPaFm=\gu%%Mf(yY#bs>oZeN>4N)^,Jxd/$Y]5AcYq)s;D5πU"<<vsfNTp$A:M<TxYi8eiltAlEC%Q:2#J^[Z>KGI5\PToL*ULo+(Xx4?UiX9c04+πU"#I-))KdjV)28;*R3In+a\Mzjr,VbF1X]qnkiwQK:<&9Wp&nNn\Yn1je1Z;TDa.vπU"$Ii\%crH.BnIW5K#m/f:*?ufIoImV$l*cy/LYCM:riSh&uUarP0\ROyU<DS/DI7πU"MXKTzsvmMU?.<q$?t%(fR+g5#:590_UgZ$2MxbB7rQ]&b,boEm>XU/,s[=IW_[9πU"HmkcpV[7lUO0^]\:YIBU2(OTlH+xL1SeZ5nzK_Yr43T=UfsWp_Z<5t/B(/*1#:QπU"?lGAc2.OF0rj=DqQG=$n6=US40gE>SGEZN7l:n<.2F_P1L*M:+0>Efs$7+,$K#dπU"DtIhKDT/Z;,B'L,hk;+[OnF?63[sZ*0>3dV>xMZMBjk:IMn[MMl1ZO&INLfKxlcπU"'u#up%()9%%'%-%(oiiFC/K)s%,'%%%e+%%%.%%%%kxjj%pSzsjyFcH,=Se5c?hπU"m5*<Fm-S=&R_.E*x,s(d?&:VexyQcJTtN/9HrT>YCBFv.wc.x#xLg3dAcYb]Q,,πU"2#w0#zPvx0XCgBD5MXmHnsM-=e&PElmv=(1c0^A8EjrucpE6W0p_,n(7g4zr9'pπU"QUGzo.nF<q5hru/&nPTt40sMPHqEHF\]0v+f-u5Tb8:vMLqRKXOQM/yX/y*<2H<πU"--;ALgis9Z6kw$uE'To#rN]tjdC76Xus$^6HxKoooI?CQT\ZA%n7VA80TG/6t3fπU"Ettwt5*uxC88,Js8iD>pt?/C[/cgiYkpZaGC6v>R#81RBPSjCqtjo8hWfMl<nB-πU"V_c-XC;uXjc.pHiG\jj6EK8H]U7#]aA=^nk81-GMH(f1Y*j#9F;#pg#B=eHwM+<πU"=;>^#rXI;(;5Vp\47AV9NLW%(<0_tua*5c[xt)$92vgikMRCXDFjUS<T5#RVCpAπU"KPfqP:>Zu/+'Le;v(s#:SL6uoksXw8HTF-e$/>s<Q7aoXZSi=7Mht*^\(u/rl>1πU"863iniK2Y+k5xFN&kCTSz.wNmCd%J$yII[opRf-L;;Q:0uf8'P2AD2\wzn00=,XπU"\^x:a0o=iMEe.5J'tj<,:uErq:1IdIeelEuoVQCZO.s66-67%bdR_eJ+i9rhpcVπU"-C<5If,%up()%9%'%R-%>%#fF0m&'0l(%%%i6%%%1%%%%lj%yuqf%sjSz7syVz;πU"0:Sea=wSqaDWfR#Qppq5=-eVqq5[)LO\Ec6*:8SmrEFBY,%nF_D;us88PexRd1sπU"8E8sDFkf=)dN>ul*-P6grreJHtZUlWJNHY:RGiF%^hn6Xj.*7qrLkgeDi,-P<3;πU"I-E_#gtL2Sy=7U$g7N8f<qOYxB*]a&7J,'sQ%Pe3Uugf78O/c2rwuPAEZEn[wq7πEND SUBπSUB V2πU"Mux:yW?z?7l#iuWLUox>R#a,5bCS26P8%FjIB]haie\vHa<$\[2[6mqKI7RrCzXπU"45KX>Im_ZK*WlKnSEp=<'K#YsF<)+pRJ_s7B#84eBU_?L1[(6J=V;;Pd,X)SVAMπU"r-P9;:*(\Txa0ZolD$DGWL5<S08gUYfF%/WXAf;u_Rs^'kcA3:Sfp6>?fgsE44?πU"th?cOi\u3a='x7#'4,<=r4,Ov=KtvR$(4WwYtUWI/[V:-IWOFm<K,)IBaTg3k$#πU"K:k:5\,^M)0rw,yI#,Jg&p?%eM+39a5H'#0*MS633()>VP[n__W=jB]C+Y&$*^zπU"d&rP5CG_/zZx3C5'01ZA2SjQAAgkr7JteH>_&>qoK3/\%4j5UHbcFiPEkbm^$:_πU"^[NT1a(0Q'U3OVQ+ZEb\Q,WG+RAe8O50MuI#]T^OhJ,R$#DJ5nHS/FO9dM>l0ekπU"ynh^+,]U_dQlY^HGhN+[CCd5n.G/FJ?E?yb5Bq=YHcayAyKXm)s)qfClZ\F6=N[πU"IFx_zbGro*P,1r+&0I[daQxf,:_v9g'i)p+FN:ykk&Ov0:f\k^rEwTA+#(V(AI.πU"atG=pLAU\gyfWo[yPh<#x0CDT:)uSr$D,X[Ap0FkjecD2rI:oQ7x?Y06a-h$CdlπU"%yJ0NV5P1f?1Gp:A<e+_DAMKx)8uWs].7u,1>r(*N,*M;&UH_)#[J,O&5BHE>ZEπU"a\JLlg]6dh.$UHx56aiVE9Ww2-nuoix,)ng2pA2d0<pH\v9\1,pdma]6lk''[Q$πU"VkL(\yHg24u2?1+w1sVrJD=bT#n0Mfwf;#Q;vgO<m+c2JG*i+^VxvFSsW#j-e'dπU"t4>-^6r9.p)rBu^sUIIQR+\d?&?f>K-sa1Xw%'up(%)9%'%%-%_&(fFEXM7gI%(πU"%%W%/%%0%%%%w&&gqt%hpSzRsyF%;,^Sk^9Ll[+dUknL%X;;([)ZP'.P(hsgDSAπU"U[(.>1[[fv)[6ZCPQq,*K.wcvd[wnoepwmsXpkQJ'#=h<KsF<t2-sdbWUJGlnBdπU"Q#IG&z-=(-XdjC.nYVW\^Y,z'81tJigm&shm-olh^IeF'haucvP<[)dDYOi%*OhπU".]6nmH&o]iF)Xdo2+t^]DX_2OjK_lkjp6/ZnE+$2DRE0PRZWP$d+Wm?m(3HH(pRπU"kaqU5Wn&n?ducrLVGneHIT7TJ]U?qn4j+:C7#qx64G<qklXAjUoiV2yea(uxT/qπU"bWB7i0$GI,Jf)S3Aa$nvaCr.1iuJn[LVJf),LhoK>3xhL=ng5M4J-rt/Iw9+-x3πU"i(-JE$,hmcu.?B$,VtEA;KM14$:\Lw9Q0Q^0qaibB8wgBAgj_Q+iB*i%>ioj_:gπU".>Jv_,RPeHZ>%E6NL[)=$7eB>k<KdMjtou.F6d<YA\1%BB-55kkU$mjU9D2&c8.πU"h,)K?7-gW-21UtPE'Pv,K:X2pWx+Id79u2=D.OaU\#RA(6Bj&LVl$F$E0FXcjv-πU"3S8D(GF&'<Qd*cBs$>Dr?p=5QoJ1O2reO&+r3<_<Y%OxP*$j(]jS,9]J*_JEU0xπU"YT:rV4>LnC4o%;RNIhuH2[)VYAMDXKk0?2r3['Be^<y2AtsOQhS[1-2M93YH-YOπU"F%Nw=Z]&xJBx2K=.TAISFIwzkZCbTZ>5p4\WGwet5E9-:bLJSGs\NW5S<PRQY$PπU"<RY1xM:'n?1,:$Tw?TDA75KNo9_BcP9[D3&g:D$,<L)^TI^8x/>TCH/f.PPVUvQπU"lLP4HfogrfiM)[>ofkuKd7\P<X]Qv9+<O&sW_obn5lAAbR[$f;l0UtQ$W7eUVvfπU"l4vS^^(U'Yz54]Z[<5#uV$FEV;W&<]QLTs)R%\=)Q]Us;=TDIZyt[xK=h2t^?i\πU"FfE.b-Oz=D:I2bhht?sFCO*/Fxn0.2gNfJmM*b3qi%0:AcJkDm<tg#_r6K#2n?,πU"?<LQOoESd+><N(15WVymI%pzfjOTWDe7gzGaeY2d\-<??:q9,Bg/,&-m)[tc1CxπU"(:T)pcI*m^sc5fDCkYjgEU.iOWqshl8h>efLHG$^Mw/g/)w>5x]\EJcdq.fG[W;πU"\If4%up()%9%'%7-%dw%fFY*=WJB&%%%V+%%%1%.%%%l%ftst%kkSzRsyFb:r:TπU"e:5Uh+ExV^SL[U'dA;7m=*s'*:Rj7s?obv/O2dw':k8VaXi^_OjmN.m]dhFvw8aπU"A4Hf#;<^euRumWVR-rcR$Bf0GC3x,_4B5<sI8xF\)h-NjXeiC?'_K%Ao(IF.EzbπU")/wfVZ^FuBQ4:<Z;v/F&NgE&Dn\e6qh?(5hmw3Cb]bVk_B;YI67]dbPMA.%S0d8πU"<3Du48?'M0GWjl$yd*1uNjIs-ZulAj4l?w)sffpGB*kpRe_tzwTF?(o6v^]aaF(πU"kivU7-KbQ6H,gBH:dw9cV;Rf(LvkpNq,<8&Jv0R+q,/K%jgfappiL1Jq.3[F<YjπU"ik<b/1p<y^uGrSC%q.%tIr+uvkj5w[PHfMaRZa/cbGDBfs0Nr&wb-?8c\Yr_eLbπU"n5iGDS&4[n[jgOpb#NXhYY#JN(#-3]J=eKGEkdC1Gopbi=QHR=*PH\T<3,3/IbwπU"j+qfdNEaY8G%:]^iRJi9>G?dTOnE2[E,Qh-py+sXp\qT:tbug5g4J/4$39dVhdDπU"bq0]AcH)G$O(,(W)+p=_^Z7.+=/%#QLI07DHFY5C1c%]+[p8ZxVWEH'NN,4n2u%πU"p()9%%'%-1%)oi4F<:M*J>%%(%M%%%%0%%%%knq(j.ni#Sin)+JCf/';U5kEZLEπU"FKqtowKdSyo]1P+UJV]tR1VRhn^p>TMP>t-WFXfDspKdi50n-x7d:A]qm[sh58IπU"<D0U9dlY2T<Qr?%I?+L>pngW,FT[3*d3QUjFWD+#YO:\RQyH5L1.UhnONc-5t&uπU"%p()9%%'%-.%Eoi:F>IF-qO*%%%%1%%%/%%%%wjf%irjS[uqx&)%:t#Rl<w=NBNπU"on#s7ZO,1(&<eckyWHP=KD7([+.#M:7iTVbdlXW4,ikh.#>,^h^X):1'wFP.HH_πU">BSHPHG4KRO:;hc-gh4#*%Dvf$<RRC1qTb:pIV&h0['<M=YJXdSOROgo,IJlLr7πU"mPhg^q\%9-;bQD6uM-%fXLH#W:d,P<g(Q3k<pUkG6eTtrDYZ,:3Nm70U4Gf,#KbπU"5CXE)cN9Mwco6,%e^2_q;E>hDepj;E5PLP6L^nBZJ$xA?'w8gU#9v<UYLb%4NH?πU"65&zttR<LjKRMim6u_<V45dC*+[PzJfD*3So)=Q=^Ee9oPa7=cqvbbbBbH5&5j+πU"$J/fVY')ubCn$-*tb^Cmt6ggYToC3Swm7m6dJF'WL'92lttiRJu4ZFdLo1[q(rNπU"_2t&$^%9QGrm_<U5['l4Qj8q6HU;lcT=(8cuD:%ZI3Et(**p,s_TY*JcYSTS+7WπU"[#uxg4XnR5w&2J8=9cgAWls(O->*8Cs5Wda7,$a9Nce3qBUNv?q'(?0P#fdHlpHπU"'.^=/2IPdYLRr]qHQtTJFPNf4z7dMRp_;i':dsMeOdC7^pfLW98$CXl:dD?G6BgπU"e;xfiHSc',EG>Vaa$l??h/,,=#/x5X*Je]Hnh%ObVE:4#4hB*kuFkW*8>4X&I0HπU"ykS'1n/7H[&iUz0S=I^sUq%-.tQAW&/2)pDONDIv<S#.._LSv$;)3PkwK)Y8nm1πU"a5f01,37WK6)$u#1.\3=+=K+^FmC4^ahKs6#6EP<N7DB.,+Ld:*#<R4rSh+&$6<πU"2Zn,d'Qb]]7&/A$p:IoGxM#V'P(XQ[.rwYuek'S;1=2SRA6jg<96?Pj+mf,ghZhπU"<u960wwN_ZhQ*I(^4HMXuXBK'$_A[h^rr</+'[eq:EHNP?Pt)bD&,WvMY-&cU?4πU"[l9pb2[uk).3t9hLS5RBWYh*:G?H\4c4>HZQYawBc584j*S0XrVh]&#?=LF<:K3πU";WjT=w$Z%VSiNYjeQpUfa?FZJ&Can]hZII;A$L$'Xa..)JL[PS*CLtt\nHd=HJ$πU"([s1r73_NVWlM&-2KP#)A>(Z#ACn?.k^n.60,W.:.sKwKGO$;ZC_Kfka-Mwh9./πU"3D1v6[$6jBS[3n8IqNNuGQ4_79SZFU;^SemEl5nM,e(==wl<_3+KX_IJNib^aKaπU"p+V1(=O-,/w9_5smd9=4to8M9*jv5s$wFs;h2]CAF6r2wjaLN)UH*7=vQK0]V&PπU"%*n7iMFy0dn:o\OYO/mXFC#u115yCjf1'k_Ha^YV/%g0Jr$.tb8SB)*P6RCgk^GπU"uj\_u.^\V8>Y)iH*Lrd/BBFG-XP;Xtd;6;W<s%e9n3/YpWAOQIfWfDZ$(3LctN3πU"$q+M8N[cQqRg+ArW;$^l[iT4>c?Ng$:=n:-N^CI4k%cLS7u'&k1VpaqB,Z0do0rπU"qEjWEUN,)<&Fng47(/Ir6D$+qsMuUgr?Yu-A^v/wjKqrSrnw/wtNj0Bs1b*++V$πU"qQqAg=sq=gS]*'J&Q1GA,M$hGa;G]nSxCspmUq(S<<1Glf<7%7nYy;y5/:Gb.<CπU"V=8*KB1YTjXL7WaoM(hXX%m;TXcgJT=clLS5zIV,a=c7_(n-PJ=jbNCBa$P_oW2πU"T39b&UaVG#Y<)NTtkd9iN8]H_QOQdVaziTj,xUgi6V0T,^P6UbFFXO*IDI,3]]HπU"4#dbu_fX(f?#1[Wx[uR_Bj:WZ6dhF=43#l1dD^4Hpp#uH(I]hL5xBlK2:v1B'zBπU"uCeO/_?7hxdKPO)gRKfV>jPQNlB_21vrPb,bn/-mk$aGp+TtY0b-Sv.$1Jk7ja4πU"U$Xovdq7I9+o3h;S(lGO^H5qlYn_Z9n;^R-KVbugNZwrxqX#C<?_jtm<Pb/f>k3πU"r'u,jT^-_K*2k3,V...*sd5)w%'up&%'9%9%%'%-4%/ii1F9p=(0Z)%%%w1%%%0πU"%%%%%%%%%&%E%%%%%%%%%h%truf%wwSi%rtup%&'9%%9%'%I-%0e.iF,l)Zdb(7πU"%%c.%%%1%%%%%%%%%&%%E%%%'-)%%%ljyu%qfsj%Sirt%up&'%9%9%%'%-%)(jiπU"FO4UYe%B/%%'bA%%%1%%%%%%%%%&%E%%%%#-.%%%l%fWkn%qjSi%rtup%&'9%%9πU"%'%#-%Ef%iFS%?Ctu'7%%f,%%%1%%%%%%%%%&%%E%%%&17%%&%lft%stkk%SirtπU"%up&'%9%9%%'%-%*KdiFGi+oz%4'%%%q'%%%1%%%%%%%%%%%E%.%%W:.%%%l%fWπU"kn%qjSt%goup%&'9%%9%'%7-%\wIfFWI4qwS1.%%XY%%%0%%%%%%%%%&%%E%%%'πU":<%%%htru%fwwS%zsyu%p&'9%%9%'%%-%o&iiF//K)s,%'%%e%+%%.%%%%%%%%%πU"&%%E%%(%=I%%%kxj%jpSz%syup%&'9%%9%'%R-%>%#fF0m&'0l(%%%i6%%%1%%%πU"%%%%%%&%%E%%%&kK%%%ljyu%qfsj%Szsy%up&'%9%9%%'%-%(_(fFmEM7g&I(%%πU"%W/%%%0%%%%%%%%%&%E%%%%2O#%%w&%gqth%pSzs%yup&%'9%9%%'%-+%dwf%FYπU"*W-JB&%%%V+%%%1%%%%%%%%%&%E[%%%)#R%%%%lfts%tkkS%zsyu%p&'9%%9%'#πU"%-%)\oiF<S:MJ>#%%%M%%%%0%%%%%%%%%&%%E%%(%rT%%%knq(j.ni#Sin)%up&πU"'%9%9%%'%-%(EoiFb>IFq'O*%%%%1%%%/%%%%%%%%%&%E%%%%$U%%%wj%firj%SπU"uqx%up*+%%%%%%1%1%'('%%%^[%%%%%πEND SUBπV2πCLOSE:IF S=213AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπErika Schulze FERN FRACTAL 100775.2275@CompuServa.Com 09-30-96 (19:42) PB 241 15824 FERN.BAS ' Load/Run under PowerBASIC to extract FERN.ZIPπDEFINT A-Z:SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"FERN.ZIP",4^6:Z&=11568:?STRING$(50,177);πU"%up()%9%%%%-%P1mfF2s%5pM+.%%\G%%%-%%%%hf%qhSfRxr^(:r>T]a56<aXDQπU"L+DYD7t)dlYV_;weSZVg__i/7j6%9^u7.z0tmmRn>kcwsJn%6p9JkN=,-M',3g>πU"i#Z1,6W1.H?la0%FK%G^fSYwAnL]0nK*>i]LLB*H,b*'tmrMN#HV:a26P[>g:oOπU"RL7V%_iD-_D(C_Sq,irI3F%W7UB]#iQ(?uA5%5V3DJcYNL?nbsr+d9ZRK=,5WbXπU">;n*a>AR=d=2[HPLLM$C*DZ?8,[bqD\.sCPX*s/g(6p6Tkm,KC*I/;MK1lYp66LπU"up_ln$tFB4lfu7-KHmKjZ&xK?I>fI8_AP&$+N#gMItgAktnI\NIn_SEarLq'uZ7πU"qbHB>BOI,NGmBp/kGHmf-c8*HnciSsjj\fk#4/F/<*YJ%MUYE'J7htj.bj;gzTUπU"yr^?+=VK8_\ey38po0ef8\p6<H3L2R2LgrZT&9q'*hM(P$rk4gWu'eV[EI'[UHEπU"^-%q>Fe=0F*$I>df8]JeCBCVl'kUNQDkFck0;aO=n9C][P]1lI<)O36[UgqY*.<πU"KqVe\JCl,uw$kaIw,<9T40;[f7;h5?BG-Yx]nMrdMSp$ETA2[lXT0\oL>bAqtKJπU"8oL#[tK4ogjCqzV=i?6O)(facBXhJI/KUtuL=uIf3b>k'TWYgX)>jr0ME&B#J6-πU"m'DEEI3'S6bb;&qaCRhQn]?gTFp=9Dwu+g2xgEnN7eSnqg9<dSr1K^X^2Mh#)U=πU"y8-mCB*Mv:QT7UY&9>J3[EB,MupagnnCgr5ME.:sa)pl8nWx-gdz(xfRK9fQ$<8πU"PSEU_Fap_Dr<.=ZH&C#t36Bu4zba9-No3*TcQo80M7X'7<QlPq0]UT?]6G1(;iEπU"RK_&XjAn(-'kJN/ws3,TWT=K^sjRhEq,%3LtTo4CYL8/MLYx'[XT>\O42q&lO7JπU";<4mZ_I;M8jxBo=86Cf/T=:p:*Lz*?c?-W,Ce4xw^jQk09vEkGAI[U$$+aw?Y'1πU".=)GgMY^Lyi%R8zm.B'MY&pYykprJo%2.4TEVMD4TaFJsNH^MWC:W_20j(4M'[rπU"xCt31]gOl[d;[Pf9J$Xf#F5Ye6vSr<l<J1L[v[1EQ.\R)di?fns9>ZCS7dAUd91πU"BCP%?Y(/c$ShA,FJ'x.;3W+s%kTjO_k=kcJ^=fEMDPv(C(<H4D>C(IQkljD%=gTπU"5-9s-,AMRXH[o-OBIGFXh8eITc1P:J?uZI;7Bob([4FXB_G(/O<:ASl/8A8cSm>πU"k09w]A[5*S0;u&$e,IeBO?B5yGu*HFE57RAr%mPW9h9r)<<)t)[.ppMnnENK%$=πU"#R<)tWf9gqnCG8NDSu*-8u^-Wb]N_&h3&vV2]dsUdOQ6B#)q5;B=0+Nzh;(npg'πU"=W3NIf9*kuJ)o1XZ.kl&3A<naP=6CqWt4er.?#3=bV\+&j3v:c#+#[7d.JaVk#<πU"PAXk>+p%Q-9V]8ZE?=Z(d-'YFkEn,)[^LN?m+XQ[;cB^%FFyV[]g]*=c5o/<#\BπU"=Nn3+S=0n7F:KO>^xpOWTixUd-V;GobDks)F&OmGfL&cnnof3qVGS%\yjVY5PXcπU"Ji[tY8z=,4;>M&BQ1GbT784STI[mztum58Pkx,0dE_xMxJ\Pu]5;R-ekr[.D*']πU"lRNjrPtB]s00Hgp[daZXYSCKLc(8l:?yM\(ii=*($^ZdGl1lSXcq._nj7LQYCMhπU"^x3dk_*/IZ)OOD-VD[$[g3\hnN(DM,Dn75VvD#(MW,m]FO:&B3c)xJ]r:xEe$QhπU"F5^tY,T*E.Ku,nL0X(c8PErWX<6Fp)rh#ruqRfp%XHt+v1M$hFrib0r'Zv.N1f_πU"RH%re*iEm)kC?L'+6;&#wTo+niMQ+fU')'GQ-$i%CjCoVMFvV+f_8\H#bY>#nb<πU"Od8:%2-IF6gIRT&Qcc,F%faJ0O.szS2'.7n^iVsobXLo\eT8*ro3\L%;cfm.UhtπU"7RpQze8s$:^foSKdaIWcAvs0,)-k<aIT=b?HTfp;M=Gp#jf,78lNn9s(_YGs]f&πU"N&up%()9%%%%-%%P1fFtv]$(&o&%%'-&%%%-%%%%hfqh%StgoCb_t7$L/=?/nY8πU"7<\7C=L$HWfhXfPGMbvUuEX%-<(N($5Y*/JoiI(7UnDPm)ZI9a/j)&fcENRCI?AπU"51rX4[IR($gO-Kw$WR.ECcvWOLb/tf$vqu6hl5CT.hQQ15',Vm--%by/'YPa*).πU"JyNy4Lz%ey5d3q9UODd=NfmA2-sSh$Y]=(\uaFD$<'[Fwbs46YjsqK5Ef]F)%[wπU"0+5fE9NipPO2<PW)q>EMIyah^gR%4#%<243&)u(F_,fl^v<APDk=H.\%BjfDz>DπU"+IFtf((&S7<N[mt)PD9Gv,&qA6zHxfcnIq34E[GCFl>Pkz9[FjFjSR-c7&(]E$lπU"FsHglp7c>pX_bLGr5hQfbtnivK*Y$h+ssZ=r>HtfiU]'UXN:c.a.VOt=DdQm4RrπU"W^6u(E<x*-KY4J^rEnCJK^CdnMIa>=gG1tJknVs<hR952]/,Y\:XvLCRoKIexlQπU"ua^ihJjxak>R6XQ9d\8/A\dg^uri\2%]WjHK:M6y+J--d/40m]\s9f1/Slvj>NrπU"wN%up()%9%%%%-%Q1%fFt.6g*S).%%7-%%%-%%%%kj%wsSy/'yDz:rB\[416:kTπU"x&,fCr5aYrf\8K+hd]nT\q5#6Obub]K7I,Jpmdsnq]87d%J60-R&3[pnP9<nJ%mπU")OhAtqFD-_H/d:sk8JF.$)Zr]?gI?Drr^Bki'$hA2U8'l=;_kH\k#mxTX3Tf8s'πU"pX6pBDTgff]P>iuE$EC\z]iqCj4l7#3;=<9hU\-;Ko_POCi6_h0+Iam8(iH:=0lπU"I.pVh_Cx7+=idGeJj]qjD%7T$<gQ*%RjR3R.C%a4JshKxJcqt>(r3n$'E7%'[5lπU"9+i)qC91EyIpMe_ha\wm=][Z*3q+Qwxp/ZJ9t<:vvtoLV4Tkqp7\p-Mw)oV)'OtπU"Nu(>ZPX$_(w_\kBW%f20e8>P$-94.KGMhZ042Ko8-]-7F92,^HDH<F>^Z-<jl-RπU"R^-WV1*Tk1fKce1-[P*S.hW<)DioGM7/OostJqegllE??MWe33RE6x.cMU+anrYπU"QMBt\&D\*G2A^+q6Y?GMxW.A.T<jhSl$RrcA>S9pe-:*O'n9t8QgZW?7ZF-]p;0πU"T-)]irk<%jSG+i09B>PO%(vz;7xnbv:CJA6f,RP]ekp$gSskC,bbM*:\_>/[1O6πU"8h<2_SgI$k5A]1LID.j'^$'ZhkKeci9C5Y)(ljw#$$_flN)9NlxP<-&;BD'j+<rπU"ti;UKPWL9_Fh&77AlhTl(=MD320?u\YL)b/*f:LADf+<OG0>X/'xJ_,#:HY8a)TπU"OiLO7=:c3oC7_.ZO0[+aI6r9qc8Ai7,m3VZk[c9xPB9)kt4ZP\HA5.6)h)6_PC_πU"7nq<gl#7iY7H.I^cCpF%)g6PUGD,P=2tSmO1b3+PT['5Z'%)i8WrUbYM0Na[-uGπU"d%a8Le7EhGbTNsZ3wr:,U4+*uf?G3a&Ty1Pe2f_Go5I19TC<=\KG]zojX7W+#w=πU"KdL]MBIL+&<7U,fH79p2JjFYEx$A0Nx'd8mf9SUW8_\'==EbuL]SFC<?tdTunUrπU"M7bXDl;i,8#r7^Nu%.xO7G(2sMl.)CCen70fr4N;Jq_P\)J/qn[2u>eA45,S04KπU"lewaZO-/_]Y&0LoEccIJ%WcFnEO='_h%u>-sJc-Nj[RH_M5,Iim.Il[Q)OdJ4iLπU"E-v179YmK0McKu>ILf%5L+.mt\,Z:M3Q:X.0Ip=WQn&&1M/G(6.MHRR92?X3D&qπU"fen2R?[%]0UOaEBg2ugNJ[tV#D&i10FU5c=[LQH$s.dXc'A&jQKpU.,69-N_XB<πU"JorXVNnEd#5LoVzn4b6jBi:,([\hUNG?WBsXn;]5Y_GrZt[4kBodgBk]RZaw$m2πU"Ur8WLHX8HsUsJLM/II'K3UKL]auCjfW%cQQ/uNvjHlgD,1#r*C'c.2S2P5&rQYOπU"FRA>Q1okWLa/Udcs8h/T7#xMANf^nZU:GA9U2\+,9$agOpr7+;>.pPn)k;K,&S-πU"NW1]2^(K\/W>nYU<BW98E%cls<#;Z#8jCSyBS6(q7>l'x'up%()9%%%%-%%Q1fFπU"^NC2u%y+%%%t<%%%/%%%%ukjw%sVSgRfxF'8:x[m+<wQz$uVxO1Uoqjg--5pBF,πU"S0NEYPQs]G7XVisJc'2zS'ZtdpkEg_.]^s\3OLs*dkogavmubL$Kk'PEP;yd3#gπU"I8kR&x#+.aQ;=KeJ3EaXl'#2\GrH/klc%&GKat=NYqt-tkfffWNB&S)e15&Z<J1πU":8P^roeOFqf-IZ]cqm'?.EjNB5^8,DIClnb?5/)/no3&n#KP82sbRwzxJU-wJ4aπU"=T54VIJ\>nZ3$5Pj?megEsW-o$nt07*S5pi.QKuZleg,]#-D7>b9Z(\+s=]Mxm+πU"RM/\c[cI#E3$=8bue^\sQO1-[MNp#bGU892Yfs-.p'.kQTGa7(S0Y*mEPQY]&1\πU"m0qT\BMFU&7d9q=>a3^]SG^uns#Oxa\>cE:Q0tR].hH2vE'8(A,ZZE<90Qj3g1<πU"W+dxYrxFEsf_lQ?.^='4[wqtijw>8-Z;lCjT5?rm)],3*vz<Y#mwK_nC)&6<UruπU"Q_?<kgj4l;*fYV7IjgI[o.'/p7hnH73(9qUn6U2Vq&0;]^Gm);iKaXw<ggz<1HcπU"&x)13\B,acph*ZZ:X5?pSa0bj((_0\KTrkaU,#FKmr:rMjcVDzaTtE*FY^L^JoOπU"<Q#i$lUo'E2TD=+e%b8_mO&<vXb+Q4u1V]8O.wP#j2%puBJ^EbN^IXwMY(_oQYDπU"2JD3-k]srq29apRSB7sn_JJHvar5+'%w^RF4_ERhL&gn,nLO\P6z;^)4jIrK\d<πU"d67u0ErHQQINY&'LynG9N8X0Z7Y')>(O-smpgAu;ZgRN-lc.I5EEH%_EGA?S]#)πU"ca[0i;Y4fAzIzP#W(x*TD%jbLe&k]k$'mWDz2a>kO=iMh,#9--2J#-,zj0&uqR$πU"vGi$1#F/$M9jc*7L=oac^=JMvW:.GwmarVVIW;tz&_*Dymu.hHPq6b(nirGCWiqπU"E/kSmgYsk.5iCvD_Aw*#4j$bu8&UJp^3pC$Bcn#J?$Cl9hlFW0ld'0;4sSJ9NT$πU"0-Zfp4ruwB1pfPch=/B(h_A#%;qo_2mwSw$N0PELRp3dH\(-=ZLTnPlPZD0$:z5πU"dZG/\=rx9(?bZ&2uIF%?%ZO3PYWKzV6>nko&CXcOR/I$Wehs&g0&s.3trh1D0^XπU"()V4yy=P,wy]PruS=j6=Rk^=-oHk&-KSH\I'-W4N<*B0*?Jt5$c;ac>N/cGkKYeπU"+9)^;by,2[:LO.9oG/qqfT$IHgST(i1fe7VB5Uh[7Zig41u_hokaamO8,9L.LygπU"MB8?S[?hixLtr3EO%Ot=AYJb=uDK7f$\1+9)Ru-nsDFmkiurwJ\eI*)'vW5DTc8πU"-)MoZp]#AW,wJx5&PZOXex':?4,0FzBsi(Db\^pkV%KDE*Q.A.)95o&cRV:)9fCπU"jHeSNAkU8gZe-fAGBA;?Z0lRSq\ra4K%QH+ts#-V>hjCu['1PBAfrq/=w)RZb[=πU";%NTy)Yd4>bS+*m$6(eJ;'Unbpp_aD%DR\TN:Qk$]ivMJ+OKnCL8a$jR;Bx152AπU"X1Cp-TH0Myd*2;/,;*gor#85:bo[oNKo=UJ>8.COG;aYR/x6Zs$w[<T0YI>Q'-qπU"ps-&Ik#wwNbHYe1fATfZY,EuFjm's>8=7e$sIPsZ9g?+vcoFtZF<po;[;pCwcQTπU"H;F)+ED84+E7+C<bpQiEGae?,')8U,7c;Hm>-&qQj?mXqhXSw<J[o,yiul;oW_4πU"KZXu1+a;CeV>AvKMjEjM4vv%[_Y/noTpsfh8g&soXD-vJLVsj#(>sWQ>^^FWPEgπU"Q9<#,T,N-9^rb\&]/Q*&GUa_(SBdv_1hVzrr6ZsW(q,s*\V/6jQ#0k/799)kRBCπU"a>YWSc.^:jaW&MjY;B6KFPBN)Dw-9eq0xQ3U_=>4D7_SCp#%j9%nU$e>?3KX$J2πU"07krhJsYBpT66M\HIR-v'[wuq9NG^U\9DjcG0M^YUs49>Y%qFrqmAQ_ok(8MIovπU"^S..UHrg'ee'QdHciAf0tsoMeD()<>u++.Siei8j.V\A'ZPpEKV8psn=H1XUGhfπU"b0M,WK&Uh(\$xP1gv_yhHNmEAC0?S*9>,rUAM0y'qTup%()9%%%%-%%Q1fFo&mWπU"1&y*%%'h5%%%/%%%%ukjw%sWSgRfx>&;<B[[F5wA5]q4$EK^E\b^&kK2,:r%k:IπU"=9Ue/SFv9K6/m4a*4ko/(mP\&P>#e+Th/0#rd>*%dDbWS,fZFxhA=RyPnOpLxA5πU"1YWH'$D'esQA9Zr%z5W&$x5ETLfDz%3W(b^n+\FdNDrrrkI'dK[wRo9n/]g3'YqπU"cH3YP#K57C/Er0H*HCI/a#<f$v$PPRS_^cqGsW=O;aFKb33A\l8J1mOKKdT-][0πU"RemMU6LKj6X9w$PPj/Od=Cr-rxIKL%t*f)]K<snKRGJGS/g;VSE4]h[$Sd_Kn9aπU";E.YjY^TaB_)u*_taor_Rn*L>sLL+F?Trx*E1pu%.PKDSfhT;F;P?[M*40MGJ('πU"m;/iTbxf]1JOneAJ'C/K2deLWl]vTI#HlTwQpRH_nChNps'xC5C0ZGgty;SZRGKπU"piu/n0[$mjdq)mWY'9?noAyWrBv0SM_51>?6d(OXr0:V6/qfawGT=P74C^p:84aπU"iM]_&Q+$^a.aIexQ5870-5AdiYc0'p0:7Ln)-IJxk#ad#HO8dS3&i,\7,U2F6<bπU"Y#n$Rae=qn'>Ux$[Cl/qtK7^(YakOenIH18]B)APFQjaEg,Ne.w6mSC)rtg7>,'πU"'+clgOtgkG5-hO8He&.w-NhhYOgoBbxnv/mfa6Ikdc\>.3FQPp4Ddoa$ebm.T%XπU"2X1,;=T9t-H6KTUTF(b87QFY&r5)In$HG?IIDg&Lo?i+1X*6uV5h-ej]CJ'Q)v;πU"4N>Q9Ed_i&FPZVCH9MY)(fTM=orh.+OkETu0:#'/*ctYqFEj)2=A5qQU;M98>Y_πU"&:5tUB/<Z#.Gl[n#'/53fP?cS5]KEGxQJMo_i:CFEa6]<'M<pEVSRY2nFHW3Ys:πU"n9SYez:TuZCF&K$DhixUQ#f:^8NTjc#5WS,5L]XNFBc*T(u-F;vm0cJ+>awQ&0zπU".2+9,[5\OV\j^EQ\6s[Rw8&VZh[Tnb'ZEl/cW')XuH1q&h=YcS3UA3uWSM_-l<4πU"iNBt)$\W/>ZCn1=?,9'^'QzF\d8:*Ql7='EBpz\rf=LiMqpPM';n8m-XT2R>7\DπU"O&ww%uW)eNA\LTV-H_b=:)0Q]\$oo60;)m(bn>j*RR(tQT'L:UkT2Q/*\a#W4ZWπU"_y8M4?x(-]$RP?#?PfW5[sKC#HyO+ut4UJ7Lc,Cte#-:jnFFRoI>=tkpI]/LRp2πU"sdeA6kRdOVpAO?Au8Z3^yNfaQu'%5*Oc5,k)fqL'DPBOnFB^W0KkcAU+\n2e_W4πU"od+_'u%y^rw%OwMzOKU'y;.*V+o*;3oJWqDp,0s(&q:pAVEq-'dIHz0c_oQ);L]πU"-ppnNoAM*bfPO_MX.CTv];U38/yG+&Q(.Qw.RtTq)U**[whhu_^$gl^*].&vs0LπU"\3]H^3VvzkS*xe/if&0kZ#U#ij$e=Z#gR]L8xFG[65laAQ-jC1);[*c0/+b4>D6πU"TWH?L=.)2e$1ce.>V/V^*<#R2ed5HT##Zdiq;oDtoYBt2'/b&j68NZvp]%X:IT2πU"xaR183[)V8cYjJ(oN'Gpy(SRt?n+Ga[WH^44%cLZCEGeZh[pLd6S6b9X2LB9-lAπU"I44UJ?\/Hi]n)slYXT[5(Z&UTLop;'^n;]/37S&LU.2NxtEKiz9HH'IVjsffmPfπU"S[HOVpbiK[PlbE,&PG2^>\_o\c=DEu*]M75Ys&7B(.]FqP]GW#wxCo1FR)jy$FiπU"DleGjLpbv^#llmg=e?LeF<6Q0.'C8G)>[J.<lPkRsa*fri0(;7]Cwn\Z=b\NfM0πU"8?h(yG7K<ash[LQvC(eaRiSkn'NumN6H5AI*Pe,?urTvRwre;$F]cD4s&hueWLcπU"PBI*ukq,<;\9^T%up()%9%%%%-%Q1IfFL^?v%(,%%%_D%%%/%%%%vk%jwsV%SgfπU"x3N(<x]\]7wVKxCN'anBIL&V\2tgZ^+7z&Eq/9XPo?;EWl3>eX0r#EBC?Ye(du.πU"]PYX%D]yS52QeQUvCzQ4N9X5:l9Y_ggU6$8SN^)F=qbV7TsmC+04>W?-4-%PwrMπU"<*,x&t)*q5ZWusl31+MRZmXU^r(5<T^V+6Hh)HSL74M[(PY9jPW025leK5;FHwgπU"SP85xDH/['.u618mZ#H2-2\3B&jG<qfgFp_C\lYnz8P:VSXhU.P-qCgV;G#4g37πU"XvN.^=?ku+m5Q.JF(.7Qg&7sFE_NSV9)^uV,=KA]LN\<N5hKFUb>(tenyy0sIO;πU"n1N'PrMd(dyH;Od+nj+nSZ8=Nk0(AVW#.*Q'b#:w(/0Pq4PJIV>tRBMufUwq3/<πU"Jy>,#;]5ET5YY^Og(#Ungh5)bk>:r$q8tJQPj%17Y7nBgS*qo4Ij7k/dDjeyA:eπU"(S&p^(efxK,hdZ48DU/0&:Olnf/qyxeO[yPqm_r1:o+;AD([w.-Q08U-Tn.<1mPπU"bUapJ'[45=**KlJ0M9]vZ83CSuQ5_[-:sKa]Uf)'>.:9KcN)(4h35G44(UT/aRdπU"J.rl5IfIUI#e&b7dlsljrQ&7)E\I]4[[)te'_Qs=iInsj25N=bjjndU>,&2m=lQπU"O90emwnxlsR[Lr%nX9452Yfw*zEb6T1m=>?bEjhy&FGZhD%.bc>mlbJs)s&hA&rπU":UQ7xPEtdZVGK4b#7/;Mo2m$%Dn0*T,IInvy,i+$]IYKKmkKR[1F#kaH#9Wi84iπU"<fY$*>\G>p$$Ful+kGduIXTdN3%DlWg](7sg.Ab>JHd#l>aMD:%nI6tgHmsncGtπU"xCVNjIWqA/m:e\]4YW(el+F;JQyVD\;'*f'XQ*3O0$+chdU.7S+P7'Pi^%0at%%πU"IxbfMoXyw=f)[.(g5/Y>u'?xpYuLNNN/C#,,orDo,$]SRSnmWig9==9&AMXucc*πU"6buR>3Zr-a5dP;<Z'^0p10V0Qup1J^lX1J*A=iD,p/Y2%aua17>Waas+9q$^V%YπU"Wtai=7WH8W,J86kA3n$=n8%^=SCjn8y/T7k5cw,c)c4Ya.Kug3(H5rK%HepIBUTπU"r%2FlWH[kscpYaHdE9BH/QU1n=(f5GBq_=]n0LPG1PQX^,lVsqH.Qz42&j?'k0YπU"1eR%4kd:[jbW^8d<DPz:7cWO<&CHRNE,=hT;4E=eut-n5ziP$D9y:Cuo\Vz&GYOπU"v6EB%$&<<I6z8o'7**gU-Tdf#yE-)_OX^1j+KA*fKq)lawDO.KewZe/)sx:tyOQπU"unBKM:NZ,\uXT348hHcwcdkRdnQSm91Vi2IJWT'7LCC/JKm(xl,g=A%mY;%5c>RπU"a?.G]snVd2Sv0krthR6Cucwap8apJKO4z9sqGzDxMOzM-ZT%N-t&dbF>W%+u>EeπU"Jp%)z];%p'6Riz^iRYbA&ein9EevvoGy(7L#K'U0;q(w7rMbjn&:ZB*U'[qE?)EπU"K[/A4>)W9Ns'lZ/0o9>Q$%)pmlRn-6*AO0iWiE[z^i/iJwhcjaN=>k-p7.Nc[rmπU"3H^AN4]4f==ii+iX1.m24Jw;88b/ZeWZgDbf.KUlqQejB6Sx)1Ntlw^_Yw_5YU;πU"]DEnc4J*0OsJ3A]6+R%[$+'25MO*O1PhY[HFGW5gBT%vT(h;v*F/%gvnmn?+fVtπU"IR[.andg)sc+5J?'9j3x8;RkWxo?_$^&\5Bfv8GL8=x+BYT,GaS?+Pi_,aXjLv<πU"j:Tbq2es$QpVCd.uh<dR#<]:>krTz:]E)h<Y.J7ja-\e\Gy)<hU.PI>S+%8ON?cπU")Pe>l\+]eie625=l/DTTy<d;E3:R(HDIu&RRVNnN'jS#q4(;nF7[I\4EF4.-yxPπU"$p,WR[HJ2S-g^gG$mc\7hQ%VH9AfK.]d'DXw9vwk7QqZ_;o2vk?>B1(uVc5cBiCπU"V=[3;COs\]k&o$eXF)SADmPzFhRj$?39*XVs_?<jV/Y+MX6SfY<KVu?1;eoW]S5πU"i4^J7yW_S#%J9Jm9F>F^vOr*fCSa/n/GcPW#RGL_WVRJG[w%M^[q^h0HOJDCWf?πU"GO78>#LOTu\_Wjf=Y^f].29^y5Ngym#(-Ad;ZIP,i[zr3>rPI[fKe[D&Hw^;k]^πU"'=_brdcSxRcjaK#?Js'#:+6ihPz:r]FV,1Ox]$hhAw#TY^ycHU&kIbj+#QqPK%fπU"b(3tf'S%UusRR_'ge.nkzfC,u._mXR:']e1rfn:HniKpTfh\oepO;lcHZ1^dKJlπU"U'R04N>U4Tdpq7&jZuKV:5:i<Un9Zo8.Yi*';tTY8AB^RWiCE;2s6W7Z-:]Eq<sπU"^A0KRd3EAl<)?[)i:O1eG0l$t1sQ/)C/uAxoCE%uCE?Smf8:YsHCRIi\DSErbp?πU">T:w3KSTm4?/xx4iY=9Gukw/u6iHiqXTeUMA=WF?d)Pn40cu5:%v+07SPQPwj2=πU".<OH&)=7PKL]NYZFy8(6)djVa.585Q19Z\ltflZASZoq4l8eA&9ALsBK,X-KVU-πU"ax%u%p()9%%%%-%%Q1fIF07%*I\/%(%'L%%%/%%%%vkj%wsWS[gfxFk)d>TR]7xπU"K+&kd5<:t/8SuPRH4]bH&ILv)2WlQ\E9pue,2)q1FB+ImCOHh.N[AcIJneBp[W>πU"l3:eX96_Q#Z?5XYE.B,DTD_?abdJ;IqeVNA8Wi5X6^viKUnGMM:FvC_9mXR<iHwπU"thlPlZ>08bqOX05u8JTWl>2HM%2no6njumn>IMAU^G8o_I>G$V)M_YEi\_5aWfzπU"0<D;+,R.$ii[d?bo\V%\AU>Qc#N/1NXW'wUJQ/WH]abkJq+^=:;+$birHn;w,bPπU"jFs;,ypf=Tg\fb_)Gx[1sQWG4\owyVzSCDTvHi7?54l48MZ?XNXvx/kTKG?qfigπU"gdePrHitwV7$nVtGE$u943.swk9?mC5Qj5c5e(2#eWtYq#.YQXZ\?TJt6FGHB<gπU"D9:K]igCCk(Nb(XKZ&[06?hpG/B:Ao[6:892QJSp$T>c/dQZ5<9Q_Pc/$sT*p6(πU"QCXX=48.aHe#TO'JANoZds8JBa(IXw0;gzT#(A0u)k6UJ]r,sOQ/YylA?Cq6RxVπU"DO]Jy5hEgS%q3,)'hBg0f%Lm\mthq-PqK1sk-.f\tYB[ocY.xTW-N\k1.R60Jk9πU">F[t4Z=fIk\+_k)TpNlbi?gU>j;q]<ZYU]Akr^l]50wJd58-&0R][x)'RNnW+ZVπU"lQdww^RQQwL]-tVP<(G-_]Cs;UGW&m]-qa8cu'Vf9ThNuCWG?42$Zrs$=H-f:jQπU"S)c=ltu1/Bk<ngSMpDXc.)LE7elv-YJbc(<?*LH1BS]u\%l*NF*6EgbZ2I^'G&&πU"_T#<l9B8d'9%Nw&]cG^/2W4(8^Zsp*+0hv^hS5g]NcDvRqL.6GT\9g-kO6OXXdJπU"eQRdAvY]]+7g#3nlvf^D2D1\hb.K/tOiIqSI9NbssE%.inG.FKp=U#-mm4Mt4meπU"T$qHOf?7YPqRC+TCGQtcQcy_uc^1\oK.s]o^<6$ecIb9*F_#lUQ\<_IXuJ-)#o/πU"O1EW6q&#My&ZC-^K>yCmRn*s?_WP4HX1Egq73fc3T3)+\*K4:b)^?,d0i0_l<gWπU"FzDue_5Fk&rbDSvC?#E;vbZY':JFgp]=a=>9sX#;D*$GjKN\1=.>rlL:3%/%Mt.πU"BUX;6B(eH1s8Zxt'jQjnImGih)I*Ugq*W[S,6*orOacb(iA9D.nsLZ\4[L]$LS.πU"vcPxWRZ$KRui.b8a7&&MmknyIAn%[_^NR^I,;?;h\iEhnVur'8[\p)6s.GD3i)LπU"MUbmMl1z*[vq;Yuh\])<t6&;sW*T_f6YM&<)oQG1zrfQM;zmV6U*Htrt)F?[c[LπU":+Zqb0NwcJ6S-S^XQ.-c,(pgXD^\mh11m7YoGWw>u5<FJ;+oW/1HIE4iL+(zQ*BπU"*uQH#]&upVvDD2#ITPT?dGTH;A4YL'UQWip8B)%VBPd\$rw>_&S<BWpf'-o43o3πU"8YXjaUZa]IY3et/SYf=1l^uUvL$\yR;x\&X/_'prbq+Qd:q=BA0Vb+HLRx:0h.^πU"%7TH2jhf9)rHM]iYoszj%o*+6:9KHYQ3MPq#oiV^oj<SgczKGKpqh#TV^%?G_IJπU"[R8cazWFgR;sdaZ,6\;ixf]q:)*f*=lU/s7K'XB^IWpQocai]5qpi+&+xxE_8rKπU"PD'UQ;r09#<.toXL2V*1]-c-[hr&EtbEk=d,60TzFTkBZ+6>d#3daj-'j-Sv1UpπU"cbdPZFVMsD$n1DSz,V7B7_s<9jN1a7XdY/rv_jL2UQ817v[il%MU.iY#Woj])UNπU"n8(='%.6a+1o'Y9Ruq;I#BwKoD%61)ueC%?tW\7N,lMWn4j=xX2*<3db400DbF+πU">*,g73I)#Q;'#.bVd8hJ1-7vLW7t8jG^2:NyU&tymb6NlEhOo]f;r?Wt+OnY;[WπU"q7vp2%KR:&nFY8ie7m9n=4[a_Qbim].\bAg4rRr20Q-(X[J6HbS[9FjHWko4mltπU"*prfXZ;L>%_jaR$m>wcijkVs7\aw05?Xbw3r,-tv5+*%Y4&7*I1rwqa_rjz2TlbπU"k=0k^P<pky0oQ6'SY3TePUT+1ex2Zq5U.u7Eh5oP]n=MuP<%_^PZ&e%>)64S/C-πEND SUBπSUB V2πU"ro4e'=UjOXfZp9cMqis3Edb9dEagn]h*rZo^_,iTlI>KNjpTg\'4y:BJ;OT1J&lπU"Ln)G-'>.]DR*er\%\1uWHt<_(RQ9)ENuH_&24S9ba:Uj*#dYHuMYO97q+]WGvmLπU"Xe;uSI3_qbvMKQ)k&c8*u&7yOGNJkDz:_&646$#iV9$.b#PDUPr&+*#T%4ltvJ<πU"It$.F3*c]l=[fnA9K0P1#)('ROC2q71oOk(su003WHWMz%q[CB-0N5(A,z=OvgyπU";%2eW5qZnx4;F-YN9sR2e3YVY$'W#OeKg%J[+G+BU[g:y*LY%U:jwM[Y)6Opb%/πU"_z4v;tPST?id6e&Q+VljAVF/o]CLPh8Tu2g%.omohucBY&26?_Ev:ii[&%y&Q*JπU"A\Ve6-wQJk\%pG*pG%DH3,huFDtPSO,\Co]I9,h4$tn&h#21lEJ:uB0HviVl:$#πU"+b^n3rcZh;OTKM;.FW27:=9Lg;zNrWm?tD']Y0hdSAeGKB<Y?aoCoqaW.:iZ.%VπU"l2krqrZ4oQoXw^(cDhPftIgbfdM*wX^U+FG?#JDJ*d1w%i1f*PQ8^#\0#6-O)qoπU"e8quaZvnJ*jFY[-on]Z>L[B(5w,\Yk:8I>?[LgerT]bRI^5_Z3%?1/P;p<de/^GπU"ifb2)s_]0/E]'3<](#/0'GGjlgxc,#DqZtGA?(tt1:dVAhz<7JeYEr?4M#7Q+C_πU"=v0R8hsq/hKNhcmumH^<'tA#QHz/K6LR=3gC.o%ZHCj9MX;WYMMS*<WHS3*1u:=πU"vNl0.EQ^9eO[^=m6kDMq0#3n#8_yK0*eUf=qN&PI2QKTZwu-0UlAEzZ?LUl5_a(πU"OB1yS;OhqGaHwehDIhCpt<90ct.Cv,_*Gr/9WsK3]^q5p;n*;wHZSVrLS?bsQu3πU"uboEZydARu,<Nc5v]]qzOo'dOV4=p*qWWFL=cpo6Lc?V$ffhi+dOVUB6^]](IykπU"'I/cg\nxWv+#+OeW*lE9$d(z\_/J<$Y%vdTWp,9<4i+fW0r:[XOXnP1J3I^GXd7πU"><#5JX%Q+D0Z)zlx^#]tXu2][8MmtZc2URCFPnjOlwmAX:fk0?yYa;$-_ONr;scπU"0(>FLOIZ1>cF?OX:T]^I\q=*<._sdq>xsOu5_513*cJE1y3Q;o]%orNrq6cpgCuπU"PlbXkJ,NO-5CnsR-6DJR#jZ/Voj3o3EGFw=[je'AOi[2[(J_IGKcqFfF.^AH,ftπU"R[7Nn>jJsD7ejN//s,B5QHfDqYAALh6>w#&a0&5xi(l?T4w;-8)KS-5HT%9\1FGπU"X;AEE,eJ9r^mUif2_IWibBmgdIai\.r1^R]i8S(,bbXVbhilKxPN/bZb?DLsV4?πU"dol:v>Gl8>mRp8lGvbD>m0;:qx&%up&'%9%9%%%%-%%P1fF-2s5p%M+%%&\G%%%πU"-%%%%%%%%%&%E%%%%%%%%%hf%qhSf%xrup%&'9%%9%%%%-%P1dfFv]6$(o&7%%-πU"&%%%-%%%%%%%%%&%%E%%%%s+%%%hfqh%Stgo%up&'%9%9%%%%-%%Q1fFmt.g*&SπU")%%&7-%%%-%%%%%%%%%&%E%%%%9-%%%kj%wsSy&'yup%&'9%%9%%%%-%Q1#fFNCπU"+2uy+%%%t<%%%/%%%%%%%%%&%%E%%%'71%%%ukjw%sVSg%fxup%&'9%%9%%%%-%πU"Q17fF&m6W1y*7%%h5%%%/%%%%%%%%%&%%E%%%%_8%%%ukjw%sWSg%fxup%&'9%%πU"9%%%%-%Q1IfFL^?v%(,%%%_D%%%/%%%%%%%%%&%%E%%%%1>%%%vkjw%sVSg%fxuπU"p%&'9%%9%%%%-%Q1#fF075%I\/.%%'L%%%/%%%%%%%%%&%%E%%%'\E%%%vkjw%sπU"WSg%fxup%*+%%%%%,%.,%Q&.%%gP%%%%%πEND SUBπV2πCLOSE:IF S=45AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπDave Shea FALLING LEAVES SIMULATION FidoNet QUIK_BAS Echo 09-29-96 (17:52) QB, QBasic, PDS 66 4283 LEAVES.BAS DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"LEAVES.ZIP",4^6:Z&=2933:?STRING$(50,177);πU"%up()%9%%%I-%HR7bFwh-41['[%%,s%%%/%%%%qj(f%jx(S%lfZfPZyB[U5OiJ%πU"z&Q&h?.MLnB0)0bK>0&:SPZ1)pkSN3lv:D8MduV('d_MF%9u8onYg$RneuZb87sπU"XqBm>J0Xfu80snfp&.^?cnTbDLN];AAb^_b<MDn?Tpdp?:7_onn3f-2d+L>fnN.πU"m8ZJXDbLNj'Q7]9R*3#ak-8<FT?ns&ttnT],g:vzoTS1OIZ0;J+W8s?Xo0X$S[1πU"CS=l-X%mult>x^\kdpbntt8atp$brp%8ZOcYz+VRM4v.Dsvr]'L,+V\U,M*tMhNπU"j]M+biLxl/Da:MrOF^ZMZ*]t2>w3AZ2c+<us\G$aSF_^tsf8nbhBjK/W[CN-kj:πU")he%]idbfM]jPE_+jQ:<TgQoTYMtM8qxtUl$wtBxbpNbMbMb>n#h=(7CZlc0Js_πU"#i[28mAA[m?Tsfit\tY2'Btt.x$<JEP'k2TC<v1ZBp#'2D$:QQ2So=S+SJ>YikKπU"wuXsm2Irc*#r39(F5/&FP=AFnp29kG$tB'FY]Zgqt\<jd8k.uN<rrBx2ZxmtCo8πU"j80?sFp&k.^inoTbv51Qj+t^33#Ft&vovf_w?'Q2KvtPl/a:^Sr^^qZM*]rt2'3πU"KAZf+\<u\'?Pa0QVH8O>>LsUKGn&],l.P5)HO4:]-_sJZ4s5l^WP5i?pFuv/;qnπU"XT-w8&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%R%%in'πU"q0up%()9%%%%-%*]]bF4,<Yl'c(%%&>6%%%/%%%#qjf%%jxSgIfxd';,>[]^9LlπU"[1d+Di=*T-Ge.9qg#m9gX^i29+<c5WWjxSV^W'%LEsYvpdKd]X,Xce7oZQ$WBhKπU">]f5WR9(L6;5(pAvYs=6E\jba_U69EAAT08j_r9L^4t67>_Lrp#OfiEbJ1;*<DLπU"?0P83[,sZi<MP(3d'Vwkqgi#Mpau_*M^HTiM&wHThi&KE?DM5quFDM54qFzW[vPπU"6.%?vP7$pyi&=qMciT&uUz+9.wvSz:.1k#()MTCj&-]M/k&>1C6R>NuLYCELh]uπU"xS79GnY3zYOX6MaXF>WHnZ4D.m9;B;v?oyigE&xGd4X'K)1aC$v&3Lg2K#4CBiMπU"X(DA+F:<$i<iPPa85afr(nFd0TnNB1VE6<H/dAa.so,V#TKJiS9h2$tF75&(OTwπU"$hES5P/X9>/qGS4mYOm#&9e=cdjJWjTm87_A-QJpxpKHN$p^jTpE>_uB]TVXa(MπU"gbf6=nG<$IAFl3+74StC_fEln1c?J6=-QpPd]=x)rPbRZ$)Ql7j/tDola3Q##h:πU"3IGY/\cl[WsWpqi19=n6>ZMDPbK;Z:k'aLv;PimL.c:,-6NLZLPbhMZ:s7'Lv;-πU"Pm*sosR'b.,HxDg[j*LR<]bVlC*oa:0kmh$^sumR*sspqAGITdLtN(%bbGte:SnπU"I#1I0'o,IFt8t(X,[A#g7J[x'>_W.qkWGUZP<Qj(a;GiGd=ska(LAs%Hc7sb_7sπU"YQ8F2wiR=fJ]u(Y(9r.Cjbn-J]wY'R9rc^jbvJB]yY(.:r-jDb(v#q:Dpd;6o>.πU"Fmw$.0G<D>^a^P1E]UF&[5<n6s>C?tuFfIfEI4ved(Fbp7Xsp,7)(1%qf28ppVNπU"aPcatcc\]L7&t,WfE>(6n3lc<rGFTkHGR_]tKh/%=F3#Yk[k-,;r&?.tvW4)r?FπU"&H6;[NnFigOQr*8m7dD+;4]N'_p'>YK,03n&4qC.#CK-'ZX9I[(j.;O,FjchkCPπU"p&zQlS.i^/A3CX])]B=j;Qt-S64FZx7EwvJK.0.nI>]pC$exw'mnyUnCXg;Iz-;πU"MP07.h(/;Z-rL^zgj(2gx&;17U-V+x(QI4161;B6/syn3;6CXq6+_+UmOXcnCg;πU"rIz%ged9H(KHZF+8LKJap&nRp>P>74;IJE;Z4=9+pA0/i2cPhB50/G(F+_q0,=gπU"J\UW+g?Hk<%1[cs;mr-NN2EFvSNDGHRN$7Ayun.6:<:W(BdFTYkQ^<?Z]WdHYkOπU"aZ0iB]U>^#A=0QC8.3V9d:XaY]qs%O;+1;2,L^->%srD%up()%9%%%I-%PRmbFvπU"O(tdH)7%%]6%%%-%%%%kf%qqSudfq,Q2:]sUm1)YxaPfBsO-]lkix3Z\PA2'8fIπU"1.lE)ZYP]rbdw?uvlPcpH_)))LZcq<F.=tvvpdu3nt4j2RK7ud3vkt<2vot<2vjπU"P<2LH]u%Q'l=G'(o*XOXus_4MMANjC:<wBmT:[ljr9*^9>^&7jW?^&)2\TZj/3BπU"ESsKoR[n1w,L6c:)fhlZXvQ.2g'MmdZXgJiZBik:O>?]V84dSK>Fl\Z1PQJwi+sπU"qCx*T-?*/-vv)vO&WQ*+v)XS,Tb,qM'SMRV8jI=bif5C+R%d)^DBMM.pVw3_-Y&πU"SBiw13d5]oI5Sr2'X3DH_$)r2%OD'JlMR(pbr:7IdAw)t21UXOC.n)[mdG%TC=KπU"hW;YiAo2,YQ%=%OXp27NN\3SjN:Im,6[&<Y+bGl0fXhC<9Wh\HbEAdCZhe8nCV)πU"pZv%E=O=du)xHFFsr]O5qIYp.mW#m7/3eGcJ:Vj_*F;g3<,PeL$8[5Tr\K]&ZR'πU"5WHN*dQ\kjkC610ZbFjgR4N(cMJWX*]EE3$D9c+4U?C+9WXe;[t_WnQYB>$g#5'πU"j_yK/J/(G60_bn5o(Bi?u/ua=n1&d5Tb_O0\F4cesCF7VYR8n](4q8EXZQn/Ei?πU"T%<^Ncg<dV[7xl2xPkDAwj)EPFA06U#/Gf&+Du$gh+^2eu0)-]F5Ag87CO2./TDπU"M0%I'_y\5Q':tEj3Ux)rmPXCwpQsagQ^jm+BE37n2#z7OchOHNEUw(.HPrAakT<πU"OIr+.TS9;]Rm6.,NSH\QdUc9g'QXL7My&yHLRRin.rN*Km2F(7oHImQJf5Ecr*QπU"5e#0y_:34^)4B,G:54jKVHh_4.8^9V;+Qe$f1Ak0Rplb-T5Mp#Sy%d;cg+cULgLπU"k<f9G--E[4AMEn+Dgev?6IEp4#-?[Ppe^CtS5sn1-H^[D,aaX(zTaT/jU$:\xXPπU"K)/%Ic[l<AUb=^Di(,8&#.Xz4d,KC1N4NWir\g5d,$Ff%h*Mupc*O.=3T5jS3b8πU"9$RK?8nf)B4hKO*^uk_*Rg2IL6/Jp&\Y>^C59(X=rMVb]Hqj4yGYi.M#X5[37&MπU"9#dW.=;&gxV<Q-2nYYx;)YCk<RWwu,l_BG6>Ts%9/NtH[N>.F;bM5R?GT&J2j-:πU"7ita'M5.q5cQ?Kl;fDUnlS%R*Q'[OS$>H4+>AW,qtu\fH'blQV>,AqPZaGp-mU-πU"K^j8OY)^_MluL80ZR)M%/7_g<weQCGp_ySQ5\%T]u*]W71vTJ<=^SSh0_o/#pXTπU",[uyT-\#AFrLGQ;u+Q^pj<Azhz<AJerWAba,ZAlcR)($WPNK1%s;GE<dsyi[AunπU"ju0t-7h4(z-#&KjNm&rd_pT_oplv%,up&%'9%9%%%%-1%HRbaFwh4'1['%7%,s%πU"%%/%%%%%%%%%%%E%%%%%%%%%q.jf%j.xS%l%fup&%'9%9%%%%-4%]]bRF,<Y+lcπU"(%(%>6%%%/%%%%%%%%%&%E#%%%-%'%%q.jf%j%xSgf%xup&%'9%9%%%%-1%PRb=πU"FvOt&dH)%+%]6%%%-%%%%%%%%%&%E#%%%?%+%%k%fqqS%ufqu%p*+%%%%%(#%(%πU"u[%%%2%/%%%%%πEND SUBπCLOSE:IF S=207AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπErika Schulze/Gunther Ilzig TGA (UN/COMPRESS) VIEWER 100775.2275@CompuServe.Com 10-17-96 (17:32) QB, QBasic, PDS, PB 409 27077 TGAVIEW.BAS ' To extract under PowerBASIC, remove the DIM from DIM SHAREDπDEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"TGA.ZIP",4^6:Z&=20018:?STRING$(50,177);πU"%up()%9%%%d-%X17vFPx%B(h5.%%3x%%%,%%%%yl%fSfxOrN+<,BT[7uwEE]sdYπU"L.Lr3VaD,\P\W'2#<bi2pUN*l:6F_r%a2oSU'my%-^utn#>I#fYapJ*g>Aknq$*πU"91&QVmL:QLvCGCLW[q7/K7&\/WWxiShOChai1MqjRB-7GGrGY^;4wI:YID<MF64πU"md86\F1HXAS-I(znh#EIn$w<uq/amqq?bYb^;d.'*t5+rqYaYefrc.\ZrN[_c\[πU"O>+4U<;oKGtze+udWJa53Gca(HmxM7L$:6+M4'H;8.yp1,xa939eGHHTt'HiY8JπU"-D$0fhsSpcJ=SIZDZC5&mB^FOF<sm=-(Ay\upk>hr2_m8UIYA.S49$HOCHq76ECπU"Hg+)[^oKg9$7svvA)K;-v8W>P'5YyQs>Qs<7kJAFWmLyCRZ,aa>p6m5o*Svq:gNπU"8K#M)IL?jSaq$SPxaeZg1damqV=E78P'XeTB)X/A)ivEF#>:&#^R-QiO/'YJ(zqπU"y,hr'ZuTiQk%s>wXG1r-9][Q87D5jp&EC#p'sKZPT5Zln[]k3*7kPs'C/Asqy,]πU"YvT/bHo)sY?(onFzM'LclpIE2ol+aef?D^TrMsGO85X[UoP;/=/>MFk$<&DV*uHπU"KH;ty6Au$Q&-4dH[YfUS.iooJ?Bm#D<01?5Qa#njm)/;wGP/G?7vOFm'Q2Rx[]NπU"-SBc'WnCI$z>byGD5a,r5^^gpfx=<-n*.ysZNm<yF_XHva)oUF>J#<g;)4e$GnHπU"$^AsnFs_52IJ*:(kgF_D.?N8BFWu:^Zo<U4F3m6(fAS-'E9o)&4x.I:Om2Up)p&πU"?^=CuD%*V91:LVaHH8N]l\1j?eex>d'Y#HT-%*au*=0:LMo#;2^#Qo;?a$$\N\,πU"tSuolqO0HMXoLq*3+3Td>J[*?hAnnY3wb.JxfFr+yQ,KK<\X:A4'uOfQ^uhc=FRπU"X(ME6<J'V\Gp'3m*n]t%A5$K'#4J9s.qjRcJcw%XX&jlZ%PlJRtI#NT'-=rIewTπU"ckNKPf=G4Rpe7z&5A#r/Qu#iO\B=n:LTbzs&mLX47P^*m/5,gbfq&>X'TNAAP(qπU"uHqfH[kA-EB(6$Vyh-OcpIsnWXzw?Pqb:sa+mb4Fx=Vd58A+M_PWAvt$JH6Sy/5πU"S(K=fV*cp8i2eT)>ITTP[*XiF[HvB*nDFF,3TQp6oWLhS0SSb((W>z%Gi&(dq3?πU"?9zDPVLmo(W+g.?(P%ki-ok_Tdx1cDc$bN1aZmL6JG;]g)vJ2#2t5eez>?X,t4mπU"Ci>*ej#SZW'3I,s.mI92KhbYzCh>r%&u\yI*4xBvhBeptQ(vxl66G)Uh0*p*[*GπU",//O6=m)*Q4JYXeZtI,'y/[b7>;T94)+3la8PAB939X0T/'$W:;KYoRD6E+ag>mπU",bqcQ/VGm=p+d?%U)sY2Pl&vZTqLe8NfQyZF/hW(J?1).e47GXXE+<4q8?>WdYOπU"\Z18lNG^n-=*%5mXDVZ'0&T]p$[>zAZ##srT(SJt<bUn1,g(EMfe6Hx-+:23bBpπU"3Vp1I>\Vi=Q[*0O%5')$(Zc[W^W7M47Mg[LPZ.(R'h=)gQpUR*$iz7ndDiUT*'LπU"<pIIX<Quf.2q)mWCqiy'9qzLA>hwA=kPDml6Y#cvCj#&%-Pt\<iAr-GMT:u4besπU"GGSxs$/Y8Q*x^=[(i,CgxVf$wp5.Q/<)-xBmHfMWW?V[^In<^K*g**fSF.oU.9#πU"i>KltOSCYea=y1jrm]Aqiyf3:L;S9#IPx2,eRm%I)Eyn6't[Q2d>z^MmR$$r(CbπU"%*4E1iijo9<ZHI+4u2B+Is%($S,f,OSVB1Mcko=YjQj$7k#]N[g^:_bCr\GOMnRπU"]Ld9/S3vHvN;4*>,xY1FA12M,ktz]heOU2GeZqP*\Ms8+x;j5.-jumKRbPW+/S_πU"XnPD]4k%s]jn.2wAJS_Je0<'/$eu7=_H/MKSt8NC)8u,%fNsJVntuUVB\HLI&y9πU"1k4]&y?iCe-)[cX/jQ*[=SNSzy-RsrkLghMRY(C\[>=Xv1*>wH?Ve?v)m;WzZ=fπU"Yqqw#nXMGcvg9FACX#khR=rAjy\H7djQzL[MW)/10UD?djnhhiIKb9T97QpErevπU"3fQlc^Y+E*Xc]TvvqCM6&Fv=]aJ4GGx[MH7f)AD=j8nEcp5\\F7nn1&fC7=\o>>πU"$ukWWMPmThLic8k)hLS;*0I&RERW.%Y+O)-DQ::ijO>Ij5m(L.#8R?A#1I#Tjo)πU"46'0=6YCWy>cbr1+9f4527)]KaZK(SD9l-5/_fjj;sV/Oq)?g)(MNyuE\sV]oH)πU"4ue57IE::/P^E6p>$GWU5#/V-Re7HMT>Of$v>k$KPU']3Bh$ufo=7<ia>SCp7I#πU"+Fkp#UxbcJ_9faZqsNLCzV:F_7WYT::<L9JA)CjTp*wFmft<l.3C,#IbZP,QY(\πU"mbi9Si1<Q.b3ecPw(^r/>=AU>HnKIqf:zATg<4.E/a%bI=IHd]<_AK6NhPn[oCIπU"\'_89y,5E^_1/+/iL1GVX0h?7pvv+yiqK(uKo9ic:J:F)4jS,ZWe#)Vr.SoWAd#πU";YjKKe5zfHLm9kXHc?[7<UAH:hgaD<SJiF0<Ip$';iM0BBf.YNM)uisf*+CI/.HπU"*'a#LUhNYr'R?>DLFbIhfL<RVS*107/fA_yAyq2XGW,,ouw#Ot,HN%0S32uDO+YπU"Crg;8:)f+<F)t/(Wtw6n0Y)g-$l%r4S97Y(A>8+cx3fLX0fWF#K#MhfQ2zFs%buπU"Y-c#E)spd1W:0b7XO[-SZ>mVpWtW$1IJLOIE'xS?L6N4o2Z98?un(w%5hAJN1b?πU"g^*JzZ'7f'dao;]Q7B7jcJis</'5fUCBd\][Up3:'*p*:BVuG,S7IuE^*/&My6[πU"POpnF2v7-ZbPsl8/;,IZ-[rlDi2iPp9oeWQ-e1lD#Q$4sPuJvMtCow[s/NJubM5πU"bVivj=&]b)QK%nA%lufO$uskx>D\-A,<tp0_m\c>R,D)bW2ZUo\u6>WWTZ;1%%mπU":i&+Brq;Z+pYht*/'9)<p/aD\/CaJD1Psr>VnsPn.QfbrUM*=PN$18-,rq;/Zp<πU"j?t+[Zjfb[dVR:fBK<s[Hr)8>Ue6hn2n,B\2S<GLImy#M&,lj_Qc)&fVTW>8fjgπU"Do/.H',uqSp&(<9o7I=oYmfuq/pN?b]$f6om5HkIPg:2a:NDUh=TJDe$JY$VEGCπU"hx__9+wiw)Ajvlx0GwReVjnI.tNsp:bx7bI8l$1IBLhBbo9jZ?aC;,QhS_/r]<HπU"M;.p*3ZI0E5DBL9=9H-uh63D_A1gR96*=CWNM>VDJ0DjC6\*,lG?r7\.?Bn;f.mπU"T,H>mmUrtNa#&OGJPS21huQ52Uu'IHQ3l/Y+4&.g8]O6(la&?VHW2lNb3Hq(9'*πU"uH>#1EXnYW^A(6Z(>=)4([w>$[-\ns;9=xR655?r+swRfrowEgH5/BY#Yisf#eWπU"^,u]uXof885dldD20^fCW#>4*rzIaw2butMUW<L\5R-[P&DHV8teo5wg.Nm:fQ7πU"_',?pPiLNj5o,<Qlt((IBR_^^uPAr#ev5Bo);saaE%TCKE&sTO_WfQ&+nL^MC*LπU"WZ^W:;<A-Flf/vDQ(g>zE)_xHp,'VXOt#''Xq,BcD7Xp//B$ITBLp<kf5LZT?p%πU"[kS=^\jju/Nn.].0[5(Twe<V?,WL*<mUfg$isEldsTTC,mFloTD'TRp:=IPs.DsπU"ljj3o&dcfQXqq&:Z=eqv?jQ[A7a'gBMa?P)V4z-]+J#j0XogB0sGEXp&Y*+_'o\πU"DB[b/i>Gu<MlYkb?yGgKFD2/2M&bGJN=]JfTeS24DxFncO)jF#C^JBrG)X'&ACmπU"hsbZWm5wY2Ue_p-Ao#QwWWdR9)ZpHD>.pi5b_9>rBQB#Q%Cq?am#/iUu]B:V_71πU"wr$92oeSpHA,l-K/vs(m&Bt5N:v-h58+LTpYE,?mTY:f#DlF$*ci50N/sK<HPf1πU"EQzlJoQ+g$wSl5k)Bg/(4E\JQ?*%<=>&HPEqt7kt%Ae/]m)+s43ulvDls^WofU/πU"]&qOv;hU>;qJ=p]p,p>1=aAd$<K[W7sasj.oCoK?smC008Z[VY)VmRg9Hs:CZSmπU"g8PHMa]4Ifsw(:U2v,u_4sl-3h,dKQd9=>tX,<es8zdEK_kh1QJ5Z-b=qHJ'74kπU"<R;ZNDXAS=E*OG\Uq0Y&8F,KMIfObtY0jHYi%kP<<%VMK[,$^0BMk2p7[GS5S9aπU">cU^Xf?D_*g8dxg2Tk$c<Q%0kGRdhv_mt8^:1QI'BO<UNk)jwVoo0<7z?lil++pπU")Qlfe7DEND*vB\/#ZW4UEd#T4uY+F<;wYx7/udCax/k&Qr6MZ.>HrTu0.wPtm5RπU"wTS=&CamoEH\uZY4/+t0ULj&K=9&IRh%iSmo8#vUFFv+(j&&k=](FhTZPR-M>1mπU"1BeXzF)QhTs^A(gG4XsYuwtMrp]J&p.?CqrN:fFFkfhS]v?M,Cr26PH:>J;?O&GπU"]%djILF+_cU/8t,NM;E.spi/SjDcoOb9Q0;bzw56fWQ2tCth-%t?0JL9*.\qGooπU"P:F5:V77jE:6eZ$F7$0Zq3IYluf.Plu$4oDtcOz]dln(lV#e[n?)n#R*%Uj;1])πU"'%6Xu,KJ^ndXPn53'e+/L3tPVaz>.E(:(gJgYTu/JatA#>(=]4vR2Xmul:Bbt'8πU"_0.v%zNcM<];)PjbEGeH<:Eh,:=#_NOW2dhlq'dP*3<u^p;VqqqU9oxEa0SxqIQπU"uO)ETD%d#ctj=shn$H76kJ(QnVIl3P;LwUuU,\Pnt'r3lin2\P3=g1K;2+fU_9#πU"q<9/H+8/ND4SMo[/N5+\A*,g45j2Ho^2I2R=x_EL?)],:>*l%LHqwf9VYOfinQ9πU"B_;SUXMmV/K^V*U*YHV'3EJQ>)$nx\vZ((w^b3RuUs1dmr];]Ng3QNg,ReI-G-ZπU"smJQfg<CF=0RjG1a#AAb=4WdG?(y'$pT:,jCoo8WvhYpI$7;oS3rZ;hxd'&'>MhπU")TG4'9e/v:YkiejwA?7-,JVS5hJ=J]2*q)1Mrr)%3>hcu%lB?QGkjg15cjV7lqTπU"d'2W0j.,]H$j;i3jJK-DvfMKZtqd=Lt4O\9_KA2?0oYOP>]oaA=fpQGT-#W#mDKπU"b?+m0*v#/DAc0WI(q+$P-n2bBApKg8+LAKkmAc^oYlr5,uQ5Q/N<.8Yc3HUJ3CQπU"$ek*M7$mx(c98#H4I9<PRJ(w0zoS.8n$Nwqp<0'dYMBL6e7(hns<#c0JYI%/zf+πU"LN$uJsl_vKYh/]eS.Q&u_>Qp_RV[Z)*?D:oao6J_w5-d9,C&FPyWiG.VeeSoNcwπU"f-#vNEiELVI_KduxYLr[N%up()%9%%%[-%z17vFRN'kYN6.%%$l%%%,%%%%yl%fπU"SgfjxV+VYATAA$7-zb+BsMlCK4h+P_-3(G]/gXl-=)&qsWmsV;lq1#-1jcRf%:OπU"FG24e&ZrSxbd]Gh>cbr&1+NqIb:HK:[**(LWXCpC?pmm1KUDk,*o=,UEsC/rb(1πU"AGKBBT5?MW.E-cYt<tNW[Ha&wAgNg<>hLynXf,G:BY40H>N>#>l:(L*HzZ\nD,+πU"AfK3*h1Wdg+H\HtJ&LW1-m#FrSg)(H#RH]F+pC,KK=u0p1r,Tc:Y/S5,QVj<YSlπU"MDu[v&3-jIcG4&A)MpRn8HE5UO_Ez2F^N0.UKDLJ^6[fa)/F0Alp:NxAf>Am:3UπU"*#+De-WRL^#5-Fe:.,lSSSO8*I,U;5)Qf*eLJU_A50xA&/I?*ZK6ImXSqIuxN4TπU"MS%GC%[ABhuT/X6F$)_lnF,i-%vMa?.+.\(;i7A;Fgw(yPN:7Kpt*uoEj7D2Oo>πU"7AB[;Y>1cl-3iHoNvgx>G.\0E5fIOqw0mFbqrB5,3Xb,i==Emn<-+qV;ME,S>0%πU"fH&'b=aQ_[Ymm[JTfzU00#n7dkFY61EP3k/0nLD*1Gmn;,/ZGqEy#o0npJ;8I($πU"e]Q[Y#3jQu+7aKjBHR\'r\7]37$$_)>'_9VjgrSP8C+Q=k/KkXpe2-vI:cQB_&pπU"q?QlZ;H::Y[$g7P1AI8+m:b&[eRsRdo[T&bQ]O+L#\>lY*/k/I_4Y(&Op?EU#uOπU"^c4semj-BX2nWZd4SUWpXEQoT?MZbT<\P1fqu]D<5R/gY%=e9WK_rK91&6XICeuπU".f+42p*PcU%1amgRJ(Cr+])0_54B^4qLH9=4lH(&o[ZjE\KeW+e))5oPWM^_t(-πU"a41)]38kd6Q4jJAd=k&.RisE)GfT%&'g')j7aD+Tqwb9e;Oh09Tjn_npD?Bg_y%πU"*8\(m(3UmnogPw;M)e\i(\CWEI*hlfg[Kc7QPlK_1HDScdR_vsC.Uq0/2U(Xvj0πU"'GFKF=YBS?n;hYfg94deFy:;d/^\el/CM1B)%J*:Jn5#T'ZGaY9><az5mH<E8,QπU"M$,V0im;FNp=K773fZjUuog5YJP6'UE*j2Of-Mf'$-Hr6SgJ5z:I-P=i-7e+j3FπU"HA^7N2oSmU=R[Ghsa:,ZriMSa)z#MXJ8e_P0BLqD+XGPEm=)S^66CdQU$L3iFn%πU",,D$7f(v8Xok'7'WgN8UT0Na5[5.j[%2(R3+sy;6mmz>P0N5K87f$R/SVC$DO,.πU"ldC:D3T3LwQfONck4+tq*%Edw..FK'c5l[37R,w,D?s=iT_LvU1]6GHdUr[%NRDπU"kGY&[Qb\Dx6h1D/j>]Xo]&w%Tz$Ma'FM?]kru+IzCz,>i[]$-hP?*D,tK][H268πU"m<9N,g6i$aYkB1?:tKH*)p,+I)u?Iw6Co0JnD?bd;wd^Fji0RKDc59&jrr0&#LxπU"m2l'J)==%^ReY+P<7aturLaJcy^Ol%gn0AsA1Njuv-7'[ehTp=<r4T-yCT8ji2jπU"Ewa%s>QcbMPK9R=^JB%Vyl03r'H/TC4_SqewiY6^CA;XEj-zKlH]X<\tA0?CjqSπU"SR&Z+m^5&/r$W<Zd3Bg<u21JItm(.R-jRa'ip;)&O;-tSzC\k3R.V'hmGpdOo0/πU"*,0.39_?RBA*T[tE.:XF7<>C8)BGJ4=cR]^7l7NXTb;h]Gl?6Qh^iE,-ONFVfXaπU".yqUZH<>AX)2WQN>l2m_3KQXo%\qc^Va;G>PCA8tAKyL/HQOu&.[ZqXfjLI[1w%πU"Z>YO-fbGf4urcMjn%l+u>3gs-i0?f&jT[\(mgnW?)KPt1fUIH#<>fbQ('%'lU?oπU"X3(GTZZ3l+ECks-c/YY_WpXZg?[;1];=sHA>fgWBWzc*Ch8IRH1MZadhI%:ae*cπU"57?4G,<0h5k&mzo9+9PO*8yI(nG^k=x7XzlTX$#rxMaIt5Bg?&%?5$vUbE6%v]6πU"GscEeo;0B6>&v<e;upX-?5]u&N%u;?:R-VjvLBN.IQiBb>n\lR&Y-I]d<>X2'sOπU"sc)6NjDws<[;LR44i<txK%Uh]FExWItV:k$QWf7?WWcH)57kJ29w/D<8/aMyNZCπU"ywY=?0H\yuSdeBia:EB1_trj=,TMHFG'jx*8YrC&.UlW[NlEu8-JmTlXa5Eo#;jπU"I'Z77G-lQoO6_3)b;KVj.Q=,&2duy)9_]K6d-?<WBqJKbJd$5X?1kEFboz1+.eIπU"TkWcs9d3G:&AvR]<M-eI)2tJRy8Y9L>0^7DDCObzZ/sJYNs6NKv(04b-Ah<nEFwπU"]OdOl8es2HX9mAd]>tkc?\B:WIO%288a5^5gmXI(Gv;6_=c+*T*'d:TjcWEH0O)πU"rs%J_2Tzuzf+>sT_*gfuSh8gk(4>Tdu.?$6;l9Z'jWHdNl];,CH_Em?RljO0JP\πU"TOC_cVQ1P>;Kk60&5O<4-HS9/Eorjf\3OcVLgUwc>3LpRKJgPfhN3Lv,#_bU8s7πU"0kV2YS2QY-fNAKE35.X&br%280(Q7^F_&Ety/0](/6Xg5mW'v^-c<H$EcnDdC>WπU"slfxiE*eEU?G.X3/l%[.&EG1OaD+pIW.g4F1Z/0GI2ffI,AyNGv%*G-;1a-UJYBπU"t]P4-%HgNUZi[cj*ab3a6P3h5J^\Xn5E5D04AiE.Mqe%\GIbGn.YID(_+r96_OeπU"RlgF284e]bJ+c=6Z'Zqco=*[dbj::AuQojsI;sV&66T.UXtr4EJm][7&M^z1;(fπU"PDYjfCw3X?8gZ\2G#U/z(yOEo#Gj^a\#u01we3]bQ$XO^h._^CQD+Hn,D\0Y]$gπU"MA)(Rz,c%fF7gZVXPcl,]'TdA\,rd6VYiv&3P;=4ACNMuJ.n$55\C<1'F2mp'0YπU"ig,#gFkA5Pig&dWddYlB80bg:Xord45IC2YR)%<)FMrTPK6ZaF:aSL3MdWR,'.=πU"^,0XSM7%mwzkJ'JtG-n4[*=5jYu>E3UhK<36e?IcOe5uxs(xrWCvdj8IM<P9>xwπU"M%3h'6'v>tOet^NrXCvDj8IM<5tE[i3N*0tu^f0-.Y#Sn,t8d2e<s%WeKV&E>WNπU"R.AC33Sj[x/6fbir'cvLIfGPhV$;O/NfDe1Roo=6:iVx7Dh0#.lU/]NZg'Uyqg#πU"vf9'%tjX7iOXfEdny7xLl]QkSDzb)ZNV[?p.b.q]lin*LkV$']GjI?Bu6zvt2GLπU"I<QkqcXG%pl.UR<aTPgMT[w*zfVn^/..VXK(k)$TI7%PDzZfxXpbpWO-Ko27dtBπU"v,J$e>jtrH\lbZ8v&&C_(Og/%i-IO:EyB*s-ctKP#t+HIA.C0en:'J(ksbnstvjπU"olX:fc&Zlak\GC^pt&<pQYhNO([[T+>&+dk,IGhCYuCNQQZ_EGXZGg/n69?jfstπU"AtscDeC-M&BfsZ1cDXGai2J$H,4^TBI_6SrQJgUptsNs5e325r]uB*j9#i:x*>UπU"upa$8xoNNS-hL/d]RzhZf:p?hc]+FW_&8F]/dSN^l[38)V=NR+t*Cv^N8D:_jkgπU"*$1*kCe9Cyo]CfZheDJc%\j\K#\^,SPY%M)xLVbv/LdZlH6<rFcoaf9[9w,Q6GbπU"wsPfeGzpO<B3d08qGzAtsfwW#uA0)I-5*aH:?7'KZK-H'#Gn<%\cvVzT/tX;$[GπU"mF0$2IrNu.GfG_x$COc[3t_RTMHj>+N_6V;.\52M0r.Z4Hfg*iBhGMg.jbhOhHoπU"y]S-<SguAS/0c)/5L:$^j+]+w\7[s,%o-L2q%*b\Nrl9IN,,''\CmC8BjFYXgcCπU"9i\R*:^rNcIWCuAbaF/NO-S85WoaWp:-V52xg##>-Y=y(9ijPE2X*?qVYXIZ&RdπU"lLAwi=i^Z'?_$V)BG0?O;BOFO\Z[fnvsV53aemB(?#MzP&o8\BWq*a2cUp_Z#:9πU"h:<1-tu/O4>o<_>,2w+WG=o&LKbq8nrFk=5,k6T:W\Y+O4:Pb?SnR#qzSsDJfP<πU"jtl'^JC[;A<3S'7hgZ9]N$0NKI&lGOc\:(W42w)CdD.+W>+qKAi<\g_VC8pG;JzπU"X#?pYYEE&bYq=*<A$YXM4r\XjBr]3V4h,THi;uL(T-+ic;sg#K/]5mkv>cY4hD7πU"caG%Vh6vDa76^ueawG)3xR(jLX7x4mD>-'Asbo8NVc%do\WS/J*534uvNn7D3ksπU"%K#Ldc&Ef*3Dv3Kt0<N\2n1vb:gz2);C[4L4ZRTofGkeOhZEDfci^=F76]]%K>>πU"Au[lH2*]QU^kfbI,4k1yswNpGxE7,w^C:Es1;(d&=L*M2FT;6_o=*ur]&NAl;_lπU"'jlk?<i03-CAk[^n4RwWUHy?zmUAPci-^D]C:Xev,<_6ACh^-]OsxIsNFG9gA#=πU"fdC>v*K3<a8f7tQ+w0H^?pGgb$VP'o$4-T#GKd0s^MkzP(F'+f(<Jk>XXbbArgnπU";(]p<k,ns<q6wB?NhW$$rFxnDK9aF\K<O'L43$Sk_FY'[LG9lo-:50-epoTqhz6πU"H4f],2#t/0&phbC]:cor55R'm0IV80V-RkQHgRipi<-dbV-Wjn:'ZfFY/xc^OQtπU"EJxZv'e>o2cJXWCSMA'eaFRf3A4#RWW1c1J'M7G6YqeNF7s'NGq$3]29D31*M(vπU"OlEzW.O,T=VuJdcMIJUEJm:\3i)dnqS7Pg)1iJDq=HuD&KQW6Q==7uU<Mmmc?hcπU"SF+YXk)1mlwWQ[u#PXJV7K>P1kuWeG5ju%FBh;#b_oJbque;<*=1=H'#FP;TmhGπU"-%tP*UJS2ZZ/pbEZ'*j5rEAbMOk2l<18U_Z+WSe'V[_IpPzT*?FI0_+cZtsh3AOπU"#Q#[?xk\glNIn$+W:b3j.Uic=opq,I(2F.B-Z&$'4ldRl1H'cYrG2W<R?aFCu?aπU"-a#q-,Q1S$lUm^=&v?oV8*I_GY#tf#^iG2pDCI;B$-dcUnfbL]Rg$h'G?ul4hyGπU"7Up<u=0?A5o\F0uakP$EZ4WZ25+hTd9GZ8%lw/z[$\+)?Hh7/VH,90aa504>uJ&πU"ch//6<=CiZIR5*Zyx<to':lBL.HNq3D\k7c;OcL9)SBnGVh[PpMeKaVOWEoXv5BπU"aR-PdRK#1mm]_Lps28qUluNnDWjJcXzVc-r%F,kg.e<5W--LMYnDL3B*&$$C8tUπU"nFf(T+-qH:B;Wk7Rt-DO<;^yf.?e5W6_T/=uS4]?M.zj']Db'>ZUtH(NIAeB\IJπU"1>FNHQnJPfFl&m<$uXm'm&]=#DQp5wJdMUIG4u#7CQu6$MOZl\JvLlXBb,Tx>YTπU"ab2TDYd%'ouj9#e^:mA.tF,KTOnJtB\v_CZ]Bv,J;[qFn37kk:Y_l$2P)N7,DrUπU"TzRcLc3tGg)X$\qqmTOe<qWJXu[A;8yD/c>e:[4t=LUgcRC4+f>Bn4CxX))wOImπU"C9<:dT$m'1CZXk.<33_puN-,)pa.>Yx=uOr?On]0jZv>\\,\)$XU+g)?5v/s#(KπU")/U(=y_o4JF)7<+sVCRsIilFiTT%it99(_mb19WY$/I%8:rpd'[o7WCJIk6)3XgπU"sa05XrR,YhHhIWCH<a((olv8%nl>3PBs6WjG.j2U5+/lu70om6zT$DT()5])-7HπU"&fD&Wg?Z>$Enfg9^,xGU;%SR%F4ianT0gi(pc.ax.(N]?dwYqH=<<D&41(MA0uGπU"a.?*\t^HVjz5'ndup%()9%%%%-%,K0vFm>HrY%p1%%&gM%%%-%%%%ylfV%SgfxNπU".(<B]Sm7w95yjD5I2G&1l5TBiTSk0=3)eu-d>cErBuoo*<O+uCj7M\t3<ws_jm>πU"6CpE[fCxtw'7XtpX9VbVbtr_jptJc._>RHOc-RofbHlTf6:]g:\.aM<siqfMk.oπU"mRl&VcvDk%EVR279(8<am:.PSWa<SFc^krSAWCS#Nh3Gs^9KJscFgj,V]rXRUgWπU"T03Bi;9Mx;KDA^/Hde*PmLLQ9AeQ\]Ul0B;$SHnS[E1[Ek^P9r]G<',f^KCxtqiπU"02i^-\?0,cCrulkkU7]b6aQxXs\<6OsC.2G$B+9rTYkNAxxmm$[$oPp4j:NdW9rπU"Y6&mFzKc?./s/%q(SsPRG195J-XOTap/9/Qm#9878;Iy$5\(Y)c=^)aqYEQ8_euπU"LS35#R,lH;SrVQ<:kv=E59.A,nseC2&)K0<^l>Z.W(n8rNYi4exF(\:?E/t05(DπU"/h]:5'IeP'31tPk20O<ZZ/0:[Q>.:A'a(?ZUZ&Eje9xdbv&1ph'o:;tSLOr4#cRπU"]1iGwW\k%xC/0N_bVdZ^DwZp4$G%Qv2$=x<BY+h8fXZVYK7<%aK4=)BUdsj%/l8πU"NriS1,a^t[]Ph(aOS#B5-.gSgHg7&-C5Ni\?[0)E*f00,Zh4e2)<2#,?a**gRv'πU"dG0;FOX_*l*s]9BH'd+1+p_O0Y]a-fepapJz:vPaUWBn]OgM9aZ^pX*RpmV\MJDπU"j+_phcgwQ87G&_DM;m*k,bac<VpH2*BC&EqG,FZw(.yYa:Rk-+ZU<wQe9Cue2R^πU"Dlr(Up<5X,PhtBf&0f4R8Cob4EVMBM)hU+(Ib6/]5c[-E.^m9bp/$6qGI8GcCmxπU"$coiZ>;]'+.%UIvh_c-.C;&>,ituc5QRFjF<B+_,VV,2X:rCITFU6BydMMlM:zbπU"])96t(,dH-Wi+/caRK196%ucM_=?N#Gm#TK<gAtWOTk:'hS;whDamJYDfOEOOZ7πU"M<'<&%A^Rq$]/<]AO*5[z%dmQ-lwVZ.JO+ZMGE'c,1G,[oko,hHuLi3bMIRSNUXπU"(+$WXCVG17l#]ejcFrpvG0&An,7gzYD.O')sDZxh:<DGYC<9;DeFaH8)aWP00(0πU"hoO)rqmoM0_d[G3':fBCeWYk\U2+<QO#'o.f,TW$($r771IDe#JfrEiek(#]&T.πU"?BErpRKu_xAh*xDA/52<[-T4\[0(sXm-L;RCNoO8WL-WuTtl[U6-Coy.q]$X+%rπU"MHCU;J,l3;1[>JC+zuo=m(oosG2eRa$<[pi3x.DGra8$L#3)y8M>L]6R-fR^JcOπU"OL)Hdf#Y2BuJv9h%%%0Xu[MgNl&TPLK#WrDv0LM.piHZf;UaCc2C0;$']2K03AWπU"tnp,=,DpJvY/]XL:A)lCYm]$>Nd9OY&dpczUTB9[kDjiRB>OWReY;T:;jtUfCaJπU"SypRlaXn%MJ>g>1cI.*9S8]Nd2ICntznd7\M54*=LG,L3uMJQ'Wi_CSCOP:kj05πU"r'(SVV6oZ=h&OqO70fjw>7NrbV(^HmScT1'O7.PH=YNnU$j.s4hxzmC]RNIG;v^πU"MxLG*u?f&F;IWbCSt55P9yABR*tmJVTOGQ3+k4>;;oG_o3I^QC./9pp[SQ>HOe1πU"L-d+kd,;+Fy\l?kdMW\s]#wUbbL+jQsl<.Syn>5d]Gkh_$S1R4J>dPd_VzlLwmvπU"_2suZDsvCb=+aC#UDkjW&.w?#X\X\vZ0KvZBVOYfzchpIpa6Qxs%&,aJHuFx5NmπU"+L>t=nS.+Z3#q1RgL=0;ynF,*tH(m3lfe9aL[)SAy5n;NM)En'8f_u;L-b6K>?jπEND SUBπSUB V2πU"$4znnk)M*De6URReK_mUK;V=%m.ou&.aw?MrCWs$I/>Xbnh4<T%NM6w64gQP)_xπU";7'('wR1JQD/ZJM#b32D:rkbnu3K,gJpY(d?x:9-JyV44=*<)k8w8]z&9u6Pn7JπU"1&JprrSr;*xgJo<+:Mx[yo]5#Q&0LQ[xQSdy\O,JDRNMi/iSLN\q-=OC(qw%HYzπU"8WDoryP%((b,:9buN(,^NMZalOa;0iLSuP5P^p>)=\??A.WWk/pi]8u(<fOqcO^πU"ARw$]Zm5*q(w$imT6>;nk'V)(NAq56O<pRo[T<4^=%PFbmUn0?h$Cqh$)m;2k$yπU"'qQ1)F,>[oqJst0]QG+/9qS>;;.5bO$JaTw0E7],6DqeO99/koU-7U])vFD_-lTπU"fH<DE2FrW)VDm^Piad7TjiCqTmdDPM7GZ,1G;<R[CzN6exgCj+CgiSd-1=zt6/JπU"h)<WAHnre^?tNC5X?UoFNM24;C%tf=aFE/2w6&n>b2>SUozPkHf,YACaaW*3>2CπU"\kzPuO_;Md.7U-n+mB2ggtq[MKNj=O]Hg/uRVfns%.Y:YRO:E#?9-8R=%_=^^0RπU"vC?g5T14CoE7K_Ir-b9p4O)my%WUCt0]m11unVFRuh4naKTJP;(b^Z34tjn%\,DπU"Ai[2wE8\wW]5WxlQd.*:%Si#E$wd;[MSJcH:kFpX^Pqx_W)tDG2qx-#TX-wrPe;πU"FqQSTUNKw',gc80KS5Vj,93WY5SUuSMV*bGWteMf2?YKxirE31m]JajCvmFvO]qπU")tUj(rmvyNLZ[3)k<hCE9Q;y6rDcyWTo(HYH1TXSTx4[:u5tLkUK*pa]F['<Y<qπU">MIi7D2>-hOIwONUXXf2[,g(mA?V0i_e2o>>NStk_2UStXRjGcDAYtJ-GocZ<VDπU"<k#fnB28j6HI';P<]j4sCe2P?NG&'iqgHJD,$I#w=AJ(,\,q(L\ASENs9?J9Q^[πU"=*aHFIWQPG+,qg4hGQ:aE%s#=nh;Z28vN%t3M0[TSLo6IFRrS(4&rG$,O,x8%;,πU"]Zpr,pjM+CIMp6VD0OI-h49vO,w[7ETMRKBZwN:v:Vj,M&n_?MTQ&kLe?3=g7GcπU"#v=Iff3:w$e0U+t-.G+A<o8V8ht)^13K8u/OMD?1?+e]-jmEPIB'K97HNUTW8\(πU".T.IEO$,E#wg(>CQRdviw05E?4A?&hH9H&)k2ncptdHYMFU-8Rcn=W^wK<AMI8NπU"[c>dN$teJYrjMqnmwOXu]l=?IO=0Mwwm6geYDghts((sr%X$p.X%Lq4MqCdk%J7πU"t[h+>6(UJ=^MVy+<N*i)Hlxbg1Uj*4>?KNccjR815[f?FtWU#*>dSV-A]w<B-<&πU"<h&m4::UM,.0f]RW;GW8H6.ouIzQ2]woD#k&+\*\U,A=*a99fp5K?W\#tVT_R1pπU"UkVXhLg*s*i=m3Lnfs&X<Z\r:tq(Y=rq-i>rmwcp/R<Ja\m:bC)&/G:72k=[fURπU"[Iri3d8wnLg<[D#RP*J)#o,;DJ$6uQ]*koI2TK<\Ror%GHo\TiF>,A*SgQEI%7\πU"Y%vh.nKQFHAVR=l<_j(&Y$P2Q--=55(ner22u*uQ6gvnxVh16L8Y3:]7R=87>_EπU"a*-:);:9]$R$*UvGO$'G\$'SoC7G6:,+e8E3?[U3bJ?#L+U4NM0R#'W-[$B6=ujπU"_oY,xZ$ES6tXJ9X6vStuFl7d8uwcY\jW/+?%\:'S''4e_$/74l#g;63gXZ<MG9JπU"Yj7e\(R.a,DSU\B6Q$0UvaOvXQ381oc#4\%*1CB/jWg3JMp[3ti?9EF?BI5Nu(,πU"xNPjvOrh(?A6EKoaplRk7?f9BT93kh=YFMv8t;_D%R)Y91\nXeC*,v<k<(vE;d,πU"*MuoV*7IZWx<E9wYiXB94dc0VmzM$Fu6^bYDy]9,B]GoX_H+]]$HW=x$P*&7a[?πU"j=_T)2A.5HiR8,akp\Mo5S3c$ma_Tn[xc_L%'wcWT\t-1UbzI*nqvtk0cHlSLITπU":rp#HBja'n6qGLOGPmta7;^P#+<HjvQQO3tx+[?ap5S-P8SLrfSL37]&94*%CsYπU"+b3>9X;D;dOnyUfM?+D=UApgexOfMQ0j\meJ*\\JUaEPQntG]2IDtnNOTOVEt.RπU"7pB]Y.boN[Yu\Y'N6qbLh'uR*jZnbBF('iwJLP[Bc#[gjTCNxyG#g8K\mQ#pLU%πU"nW^'hQ=tbM.cDjZA2VPvq'v+fx*u%p()9%%%%-=%'5uaFVyg-[91%(%^T%%%-%%πU"(%%nj&&SgfOxV)*>BT36hMe6u4D/8s;<nC_MalZ^^$=OB$-r^+Vt$]sBb#iQF7#πU"9pm&fDCa4dhSZ#G-L*aNO;m%T[>f/7vfecTu:0V4J(u)4IWt^Hpe-ge2^;j#+]+πU"*vqSET\sJ:1.jEiSSS05vb_ieR$^'IM,f#C=FleSD2&2[])7;,Ysci,PF;p4s<_πU"_^]gjD(r_FiY/Pl8N1T;,fBS(1V$>AsS'wN-(<]#lT)DG(]]p6uk_:YjM*'H1j3πU"<]u'S)7]<k>dE(j:p^F;L)=fKC.:RPn2NhT>&Eep,*AWO]=kBjU[l6>6*'_2JCrπU"hnxiuRW/=+Yi*$NNo5^pr^U36TjN-iQF0>.iP^]WW7UfK8i#c*PQkOYO=+P_8NeπU"XijF^F-LF.n],E:Nz0*Fh#<)D5brd)9q\lxB.9)dZ6JT4cV.C0/gEq[AO.<+JgrπU">phR.iuv&_aRxrp&'Y(JPEU38nx[mA>V<).LU,04?c?G074-E*n,5F&#hExd;._πU"'C*>f5o-Fr#SQl/WgIy3#RTNYxp7AY37F:K'8L?EI+M9^2,<gR6(wMdxn^AG6&wπU"lFY>jh.2C$nKe/IfpsGZgfNGZ65/ZB;Ij-s-3wdIGO1jgcVKIJ/98mpV-meDj^DπU")%iU5T=hvRf%b/c=Xt/v/YVhpgH:Q3eY=op#i_gY:Y678nQg0RtAF6RM+c13Du9πU"EqnC[C'Id%SQd)-sIqzCj.3J\>oqT>/kl_.hH$1'TD+rUi,BvCkf#BB*t#iRrsCπU"-/ssubY5VI*fs&P?GrQUp$+A^s2sMCc#k%Mh+/e/1yQ#S(\oE%H^]i+5,=uMPA/πU"r=yjDv7.WS2hrycZY6F9r09]]oe%lA^i]wm,lN%QA+qUa[-_x]=_lz<?*6h<ab/πU"u:\1s9JBRq36^XHDnGFM]yQK(P1(e$Jq<iwQT;8.hleu>Yd5Re[lR\7Vz4(m4e9πU",TKaMnd/[ILq+YPi;78MfkG9dU-gI:;BB^a3aJk)P2l&wQBTK3(Prqb16e:WfocπU"z6eb*i+_/y+-0\tB7SelijR_A6a:sS\H39xcratk[608HMi&z1oJ3:pq%&cl#&0πU"L38/+<H6Ck7D%Rg8FM6V;AG<0$*(dsKAst=-KF0-+kAv:RU?eJi^I4HbVx.>jOCπU"(fFN=\J^f8yjr%%ZtCLX5]H:+3%sgAbm2pr'+]C4G#1HZHGwp*8G&H&4BV5-v_?πU"qW/$Ojwgq3b([1[$vWTGHMu_?g]_3-6dPnhg+V;5wNC)/%[5Q#j?r4Lw2LXJSMsπU"(k0cZ3Jb;-#In$m\OKA;KjN=^67+y>VMTYvFeu:(GVIYr6(n78i+6kWXe\>*a-PπU"r*8*4)k3D4P:)6LHj/KP6Z3tJy4S6PfZ(uyiB8/&FI[a18jlFRj_Q9LJEnU8bb[πU"B2Y]nMx3/US<I7[Y3oFM=u$K'1>HuC;X^]p&9NZT1SFuhP[FI)2$teOU)X>$D&fπU"D:\-62_96^=QOXNOl,m[qOVR2Nd_v3fjixK?,fBtV^4]*G&vl7hmJmBBO:P?D)gπU"iqH^PviKc]kJW/A?XAc^2<K55EdCk\1g]LmK?hJwJQgfQcJ7UlqRu$Ic'c^*rWvπU"W(HGmY*/Vl>fVZ2/kY^tlWM9.e'ydj\yfajJuyo\^JpI89a4S8C=]+,Qdu53InCπU"fS1'+nnB<,X'[WT5Y&JxsUCv$ARiZsFN$tb*\Mp4l6<NxfR?A&m+RM-Eppum:NuπU")P09Wsr.xJKOl/&'Lm'MTN=DS=SZypbS:>K>KRWSG%EDe0fe3WIgJOJA8NUYBQJπU"N=XU.bhV04$+*/D^C9exVCsr>SrJAB1XuLoJUB_+53Q9h.2twZM*9qu^6TQr6<lπU",/PZqiD[tb^U,10+%Jbfn%P8V2'2]/44)c60kVYYR_cTT6o)qyGt<Rn*daGJQSWπU"g2h6em2l6dpO->2']yul<\31J'8Z?2akI>Uh+n^,R-N9cpj'GRVB9XIo:QZ2?72πU"+k062<x/uE)ucgRj'K:,:C0JDKQM62Fc04c*:Qr?bE*pf/:mhfeT11Z-38G3_CEπU"BSJNOSCu$ld[uEjU#mdFn#88'Kpa4*lz.&5K;6Yg9G_\6[>c-bW9Ap5fG)u<>^[πU"CgZ.l]irLYb8K9['sc3N+IH(Io[]Ds1jE7^,CRqu)BMm#Fj7m)g/,fJYD9NOAW4πU"[TA+OGVv&_OsN#Q^bC]5*2)%LhB^(IXIu+20WV;v:)n)OSwmF,Jd,Q0(sr:p3<kπU"P[:-xg9TQ,a3A'^D+Rh,a7rGRoG+PI<6mm$gHzl3+WWYIPcmJ&t?x)<FN2j0Hb6πU"Lsr1y.s#Bs=VlSKb]fd4eh,H;qc%2R5XAqx'Ce\;&$LGICFXLg2wevb%R/<2RQ7πU"s&mFS,]\$OXgushk(doNKBn#3a+]e(hw^r1tsQXTLy9eY3/Bo0+*SU*2t6$LN&1πU"WOqR-wU$\eueqS4XQ%/rs-UW)n5a,AZQme9#Vf#XjFo)gR$13RBc1\_,;aFv5LTπU"eLxT<05h0S5xrb4pU.RKgks'=P\n7uv[F):ugO>2FP]o4$On7^qOpn8qU8FqcP(πU"mXf8$+uP0[:h-x2ubeV4o,4fJuQ3UPdh2[khRgO2''K=s[k#).66\rh^Q+yG8t\πU"w=2JF6?T2?3x'WZo82f.$034s5dHWVfr]vkvOfo;C:Tq?o,K;6IxSZ0Esq-m61rπU"e\sVu?]+vN;3]5D8g+0GUcKuES'gUmsr-m[N.NQSB7Ew+spV,Oz.dxh^#9=rM*;πU"48'#,hQ=NRu/$U]t,NI9O-jLH>l+Vl-cKReC8fj4$=[lj)_$3us_3q.b(q2qr75πU"/;j(QyuJ',AeoH=#r3JFlz&1ng%LZXZ]'d54ZJgm/?w*(lATtJPVwuF2n[shHsQπU"5_x/->0IG]ke+A9?q+TDezMaw+I3M2/<s85X,lQih+(&t,V&KcX,.=#qG%\>C2gπU"eFU^*a=/z.G9n2U-']NiTZm'xEW;DJm.ZPp(*T.b/s5j^:cOmtRZlvOPSR&)^ZnπU"G8ANu/>I6uan&oS3WS>EN^39JJXy:?[l:]b]^rWY=4XV:S*'$89Bht:H&GF:Jw#πU"$N:P(:>uaCQ>I1l-IG#cBOT5l?L7SWbV$x7pM(Q*^30fG'gsXbWBfI[DRIQs9XUπU"/ICEC.QsF^dbJ;W.,z(WTnGAaxY28R+5\g\Fq%f,:V1dkuYfe2L*Y3.o/56S=v,πU">h4gLpRgm8tNwd*K$T*o5L:uqIlZ4srSVhnh$cL7q;Popo8bou8H0-TtGSGBZ+uπU"+>>*R7IUB7b\oKPofoI;]W&*i0H\[oEGZYan:t4Fx+HV[Hr)YM$rQTYJp(_0UL9πU"OB$_Lu1z,q8*-N3Ub[[3\kUpVUD//eyvy)T/jDCg7vm9ZgFP:6sU-=D1m=FKarJπU"$T,:OX*q6prf*:he)_#^S7r<h^*TpJJZosI5/[$-ejio+XF3Faw[zukxin7V>ZwπU"90o%Bb8?S/(6[-wx32if%1.\>ePj0a\oZ98:fDM^mvNfvtv,+O0?vZ[a\G$8_dNπU".X:0baxu:k5ymUJk&#gk=U6/V7(#0\d_zMCe\uummnLrbZ19wGcvL_rh<uCF0ldπU"%98te8rB^MzsDq9wuFDHb&)Cs6wrDv9n[9][0Q\VH]Z3(\:UJhgr=qPiOas0z2.πU"OddGl?/ZjPa[%*qg#Lq>IqRx\v(CJ5QZ<VqyrS]Q_HZmlKmr3shH=hGZX>RJ2,4πU"b<oLSouBJ?vI8rL,N_%s]dZh(?>%XcsGoTC*X54QC'Nu^Z\M+R&h7%Y]?g2Q9guπU"M:5uAixuU%NjV^]jEQ,mJw;S;\M<#,Z^_S/20Ch\EE5P?bbDo_31JmeM^#hhFv6πU"JWd?S8_Ra8u5qI(BuqYL(Imur6tcA[_]3Oip<t&\bi2-1g?k*Ig_M>7%tGC1k+0πU"e6k*9'?;Z/gI7UD2LTa^*n01C%m/mKpKmnv8TAHw=k\dC6C1_4LF'nxz99lKaK[πU"Dxv,.#iLHkKdh9LT;l857YT7^X5>.B(7NN,%mnq2tQ4ifsKPmF*G8ToS1WM*4t.πU">(=F,#HWG+fikrKF&klF:,8De\#/uYL98ya0Vi%CjP&3bqT<Tge1%h0d:n9YkQ7πU"(yvh'5I(ag/q_HI-[ShsPT3=*goDlwBHB'Kehb'Ag(LOcYajtg$w:uigG8%&up(πU"%)9%%#%-%R'-uF]q<C0t%&%%c%,%%-#%%%%.nj&S[nsh.hd,>SdU9U(+f[dA+zLπU"MwX$n\=]KSEB/)YeqX)?.XD^Rj1k&/Pj$h:LZXH%-9Afj/ArEJWlu]]QgqM:gcZπU"-48V?:eDU6mYnTH$OM*5vv8Y11N+9GW8+rhZ%zNQF1'QJ(E3K<'WS_JhDGrKw]OπU"G%_%tc\<,P?pu,s,k7e.2hn-vVGA:^(Aq+'X=::5u$:i8i>r1gWgk\u+;h>PIDRπU"2#TTPID3Lg[DBIQlMDpDnd^.i6p44k<?7Ra)\z3kx3a\s]?oCs$-Li-F\a?^AlKπU"*jQXXoYk8cdvFm=&I0Gw?mtW,)12YdsJ>TtWDm&nl&&UUsc<fv_2,]:UdTkoGBnπU"ZEK/-wZM6YjFR%:X=E\1o&d#.UEFXdTF%8LYP7JG?/:=2#?pI2)_R9J]gOpPMNZπU"b>*+35qm/+t_t/o.ksG;>).F/p?%GcR4%HCnYeXOF9T$Plo*Zu/dWt4a[V&lXE*πU";qfZ$8NYNnUEW3=T$Y$Q2f4>?LtvmlDQ(*z7M1tz;Z8%h=*'<=5%oBDUCJBEd^YπU"bN0lkVnnW+T1XgVDl,NXQy;/rMK]SbrY5MnYZ1JYnd&M1\8]N;Kd[&8Y:pPli3#πU":5=1mqZ5UQc*d9<#RUQ#(0+hz5C0P[MKuoo#E>Y?K-YMu%a(up%()9%%%%-%,R-πU"uFK/0S#%_+%%&z0%%%-%%%A%nj&%Sugq06zNqaxPCxYmWK.+WdEHA*[pX&Yx8+QπU"[EJ^RiN-&Qc-/J:N7/?lVaM+mRgtkSeaOAT$pTz$V4SwLe'C5?t<2R]Dq+qDVwUπU"Y7+gI=GU?UV8jMqmNWaVRt?XpUrTeO2h3Ngpl6pJGrvMgpkkh^lsb$qXRXX4WU/πU"O*OUg<A^Gx\'7K2reQuC+FsKk/Z25bF9Nt.]-22;+(ZQDSkhrN]kCf&zW1D;%B6πU"Yz^/%D)<+v<F1&e0/^DZ%s$llh4e*/,c(RQE,B;zjzhy)f,AM4Km3*\QD/xak4.πU"+.WLP6pQ5+9JhKEzVon'$-C]+M7-]x3bESu[YAY&'IoI[732z/&hVL>A[oGc<rlπU"oeM#M;87wYzXv%oVC,Rk,0vZ<nFW['(PM_[7Wgbc=sT/B_J+<I1VW;p^WJ8Ikd^πU"NDK?6w9&;GGF\D3:&pG8ya1Jw5=A&CrOC>fyKM>3)J+'o)=mF8&G5=QS:wBmA'9πU"RV#Q:-3H4-MYkLib(*%sEKc\]mos'7'=xK-7H+FrY,4Q/MSMalYb>2f35T(&[OuπU"4W>2)>U=>-:JAfEQi,1A4Fbgk)^1EZ*t'Ari[2W?bf:r9I9\g'I48PBIFZcM1o)πU"]R.&'8yAHQtT,8';KRrZg-i8uvB/?kasS&1]LAr;SGC4JT^>Hl<>.9-zbL$BT*(πU"T,yx;DPNi94tT,KkMqq2W&/2'W8%b&=r]l+,tY+iakeqR2]6>9*Mw:=(u4km9*eπU"08h)M]V=OaW<Y(U&R#,kAAXk2K/]+/::W>;vh,a$]1=/Jn*Ev:jlwwC\6PMgFWgπU"<T+u(XILtsbM<JNc:^$tupu?endqM)0-?G7_sDiX%l-*t57_qi31+4/Xvg*&W_dπU"9+YmqeMMRx>mZt=E4>Ox*W$2(.pSDU$-thbmmA+/o4P?ULCSJ,QvExJ>EX%L]ggπU",B*sEbBI&o^2Bqn2)E=szSlRXY(STbahTGS)hWJ$,?=QSPvXowt2_gl8u++?dTaπU"YFV,.7$^s&TWoa-8vXhs9DhwpyKFGoX,X^<M'rn_Dv?5??,%34#0US:=BWp>v;PπU"b)n+U^uY>17[yBBjm/hWD?06ur22'lDAMGc6[Ky^4pkhB^+_XQ[G\,$9LT;8JCCπU"I[BDs6#AjZkZAtDAnAj2AM]l6A0]aMklA0&AH_;QZQmKYT'6$&ii>pRAT*<gzD/πU"5yCy2F0ts*P2*BE'#Kmd2_aJ)NWKfOShV\Z2bwWoHWkNdfU'D9\pf:I(XaW&;UyπU"?pLcOkRuiXMb[$ExO,hGoa)_\t?2T3)&a/71MAwItngESMFdoDRIS[16nDSYF_%πU"k,3Y%\,Ck7Lw7hJphPr=aHhb%91C/O)q5mB#[=[0g4W9e$&cTDQKXM+[lD);QK4πU"=fY(wIC;+up38ZPOjEAZf:&-q%<$VxTK&o(##:)Ps:]=?*0L&I;/KI5wO321')yπU"aRLL/[sgGL-YbQk&V+XJY-A#+M25LID7tgcqOZ0P,3?ilycVL(teTAo>QIXgo;rπU"PobVs?wr]CXT,1/(B1)a]1f.%(,Gop?NOIBfsIEafb#Y]Jr7PM=j3(m^pXQv+pbπU"cL4WqZGE^wI'.3Po%^o/(gBwk]Z\HMEn<]<Ko_]a[K#scFa+Y*72rWbWV.BX/b)πU"C&Fn8ukV>EAeqk^?hVgsz:V4EvfK%b1W+L%YDIai+ZU<oe25e\7dK)1\YU6XB</πU"d.k;5lu<gd#kv,]YR.DN;SOZ*?Y;X2vCTUTU6RZXs1g^ITR3Be28V%iI%S?;A7hπU"RGHHJl$)XIL,I+HXgqQgvmjX^'vmfjAf9n]/gdLs4IPN6XfuJNa1TU5JNb-TjciπU"CA&0vpo1?ahf__O0=g]P0M,UBNFE.&PKsBB2]GAHred;j#5$NhG-Jpu,Ls5$oNfπU"iP;lXNugH.&>,a93W'e5XH9)HrFj#ecQ&p-$zd]C#UgNk1GhpAS6ah>nc8*hef\πU"6Ks[(Zx]pr.N$e=DtiWTYzovUGH1zkGLp,u80p#*GN]v#$T^U3ru0UcgX]X8^\(πU"I]Ld+b'ldup%()9%%%%-%,X1vFh6R[\&I*%%&%;%%%0%%%A%nj&%xzgS[gfxF2'πU"<>?m^5w5b$kD_Yy_&TnYIN.4G0,6Q+2orJO-wFP&nR0p2'V.c2.\9?vsl06)WTrπU"IFrsBjJ3[#NH]6mtHei3uWb<#ZC^#.d44-X=[T.CtC3f3tNLhsuKKgmC?n#Nrt?πU"XjKv#8w00dF?mrDs&skhiYH?(\:n,^T8eU;mV3\#JYs_vKgrWcm#5/jOgk7/*8qπU"ntG0rv%6PP70o]c;Zj^2iW)5CAn?.M:hIc9DsWa3X_7O0MTW-Xg#iB:hpn53x-DπU"AF*AFp)QSEKI=7]2\gE3L1=B](+eiBT0W:pY'aY67tu>=]DX#Ng\EGYG^t;t:9mπU"^__+=1t+%VpI;3_JraY:NeqtDsPF=kvi%QYDl1V1rnVlxP:pfNP<k/*\V,'khvwπU"dkvM7]jGq%E,7j$&n=;8B4=*+DB_i7&[Fe'K:M5$T/2RC1&R3Y';V5O8g[SM^^/πU"Zv7e'EEf;6Z0FX1]uj:(v$Am,S?(a]U:Jz%EU&$%<?)O\];o)1TSBX3%f^?/G,5πU"R\F8+q?8&nJjiWL+g$/uP^RO);sf8V9t0*Ht5l:V5S,cjOh]:HM;VZ)Xgizb<cPπU"o[63-[MSUg]'>)UB0+eD#IDs?S#)>;Y5&Gs-1-[1=dQ)ULhPFeKfh,TXnQ[iY(8πU"K=r39RvY9>[tg/u5UQJpgUAgo4K'eIr(8)5>Ybk1.6.pfY$;>;ujbCdY[bE.$u-πU"D(_-zV-e.h\a^3Z^&T.WRb[C3eP\Fs=;GZ.VHJ*lKc29wFLPy^P_*xX3_+8)KvFπU"4-*]go:2LHrvu[05J.M>*bh-u^hgb(imq':/dT.KuZ^,ZH#A#sy59q#v.UxhXgoπU"Fw(2VE(NGHA;Iqd_6xDFG\G&l$_ZkE--W14VYN7(>x3GS,^i%Hj^n_EsWGCPZJxπU"F#mM/]F:cjtAKr)o7EuBqRb-#2Ot8FDVis$O-^>kH]\JDMYh*FXE'pMmB&3L:M)πU"2;XD+H#'E^;'AUzdn&H6CzdV%.FUcUerP[QN>PsX^_a.7nvIIiWjjPj8<Fe4F,>πU"bik^mfSuPtkmXPk$2i*qm*GoYqoHbkGq[]&27-DX2[#87+2]H#mRn;PWdaI(FARπU"MiAHJY.P<qYr%,1WC#g2P\uluA&/gLB4SjD:>YiD?wEIu.n7]&H>C](>3qijOX(πU"2uEJ5bqan?VRC\AfGzSh_\X-NQHIKSkE7ySBZ&/CKNKU9%^YW(#(8L0DUB%n0NYπU"NN(kK*TTzU&n)[HZ*3ozwdl9i;D40,-g.TAO=O=9s1Xj)nsZXL%:\=FNqIKpZL;πU"IFMOp_$[eCTj<-nGoAQnUP&P%'h;Pj4r$j(c(wSyMgSBFEgC]*y.VEREZeUr/wJπU"04cKsR-B?'up);X[Ib9ie7#dob3LWmVCV>+UOo?E_E;7=K2/Gd.8MN'NGaGW(\pπU"\mN,sR5%hsLX+P>KT7i[9Q=Z/)(b[/5H6N+1BR+LDJU-'P_JK=8#<eF%XRho#FJπU"wwx;th<5-W*5G1E.5Pe6E8tb0dN(SRZZX5efu7g2+0-2bCs(E(*pm5OkZCLHf/NπU"0f6Qb#eDDyw)lY=IQ_POKYbRHI;xq&S+ZQYg^c*Ot'r27_,C_lp-.N\POHKe*?DπU"x,L8zyUzg^5v6u.6(uQ_6n$A%KH]q6ST^WN9iEl\/7D)?p;IVCgw<c47]eK%-T9πU"9iH/cZsWf1=wE[rP$R*5eE<i#Dsum;3oajl4*#aA9t%Su8jPZzoVahxZ$fwkFR7πU"NxVT<6pT-$oIpfNeK.B^huCdSZ=bf0Yv?LQKjP4oTMmJxxw%(up(%)9%%[%-%t&πU"bvFd9TYI5%(%%M%+%%/%%%%w%jfir%jSVx^yDyD,AT]5$5r/x7Ul4oP5u'*\]tPπU"Be-Tzu[ugN''S#i3(Ncfef:hYk0n>OyCQ6RmiighgfbC?/1iwtgkgV^+HxkNc^kπU"JF.l4Z[,o,1YduVaoj#S$P5$INLv2(f'#a0LV%W%8%7UB6$cMCnNL)g3y8$WaoLπU"B'Q_V[z)(R\Y+^4War$NRi,v#*u.9D32]Yl5O6GfGPfg<7f.V)1/\[oK%'dW.A^πU"R(uX0ug.J#^/oGStSi-H&tR0B]bE=1R#eR;]WoJpMUEj0-\nj&M;MH'rDrK7G'sπU"_%,pe/D1nd^u*L8QL<9%z_1[%?te_.<_:G1r0tX0s=kW\j\+<Ze&pL#+xhwrx6*πU"PZ(IN0iq^d2$WPr#s4h9?>o];/l4fuBX#Sd&9Gcp.<>K5l$isD.pb2pu0\Q]XR]πU"xt\6)-a3P1m)%]=*[K%TF.-]Gx4;EK0J,2xS;nSd#IU=XC-gSJnNP&yh8i'8D%wπU"F*K'NE%cQtY^p+t(Z%>iia%G-7wMG-Z2/Q(m5A;J/CcME1j>nDXlrL#EObJa(9xπU"2yAu1R9.TaHX8OjiE>D[cqK)Ja^#:7&A&>0SQ.EsCrP)#G'#/,'edMO1$Yf;xMKπU"?yj7b9.r.n%G2+2q])IVy],rEu8_nRjpZHUcr^#/VScX[NLI#(z2QZHX31ug/TZπU"HUp9Hh$hNEgh<e1&EwXK(RM]3$Dw>uxp]b*PoVI.?;qpTfN;Z\Q2*ioO,'I/z&LπU"7*<h)G20jn2NBu3])>Khf)[uNA7d<LZdPSgq$?ai+TILxZV.?^0t6/cy7\+\vD1πU"=[?7_.-_9nAM:(Otfubo$rt%1iAMCTNHfl3r>vlW_w7,nT_o+,:Le6uUZqcUf:#πU"7>FPn9ig+,C'qj/R?IFr,3]i4BMc:?f\Uq93>%j<o<cX<SHOF:V7VJZGXR+8]lGπU"d('Y8A>MtRq1hRIsXjzYn+Z;Aa<\?)EI_An-3GHhVfk^q3SNa5F#(aTw$70>AW'πU"VerJ68%%up&%'9%9%%%%-:%X1v+FPxB%(h5%(%3x%%%,%%%%%%%%%&%E%%%%%%%πU"%%y%lfSf%xrup%&'9%%9%%%[-%z17vFRN'kYN6.%%$l%%%,%%%%%%%%%&%%E%%%πU"&75%%%ylfS%gfxu%p&'9%%9%%#%-%K'0vF>=HrYp#1%%g%M%%-%%%%%%%%%&%%EπU"%%+%/F%%%ylf%VSgf%xup&%'9%9%%%%-=%'5uaFVyg-[91%(%^T%%%-%%%%%%%%πU"%&%E%%%%L#S%%%.nj&S%gfxu%p&'9%%9%%#%-%R'-uF]q<C0t%&%%c%,%%-%%%%πU"%%%%%&%%E%%%%2$%(%%nj&&Sns%hup&%'9%9%%%%-:%R-uFF/0S&#_+%(%z0%%%πU"-%%%%%%%%%%%E%%%%S#b%%%.nj&S%ugqu%p&'9%%9%%#%-%XB1vF6VR[\I#*%%%πU"%;%%0%%%%%%%%%&%%E%%(%]h%(%%nj&&xzg%Sgfx%up&'%9%9%%%%-%*tbvFadTπU"YI%5(%%%M+%%%/%%%%%%%%%&%E%%%%Vn%%%wj%firj%SVxy%up*+%%%%%%-%-%'πU",&%%&8q%%%%%πEND SUBπV2πCLOSE:IF S=244AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπDouglas H. Lusher SCREEN 13 PAGE FLIPPING FidoNet QUIK_BAS Echo 10-17-96 (09:38) QB, PDS 151 9910 SCREEN13.BAS'This code allows animation by "page flipping" in SCREEN 13.π'SCREEN 13, of course, has only one page, so this pageπ'flipping effect is achieved by creating pages in mainπ'memory and copying them quickly to display memory. Theπ'system works by assigning each page an integer variable nameπ'and assigning to this variable the segment at which the pageπ'starts. This is the value that will be passed to many of theπ'asm routines that I've written for various purposes. For example:ππDEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"SCREEN13.ZIP",4^6:Z&=6799:?STRING$(50,177);πU"%up()#9%%O[-%L(mvF+E=VP))%%%z0%%%.%%%%ij%rtVS#gfx\h%,>\.[5KTuIxπU")p__BAq>[U2Mni(sY:]=Ge:SfSs9SaK75<*pmqds%1?874p,L2r3IV1'qu2,,,WπU"<dY94c4hSu$)38tSbVm5Iw#'2vf^49L#18^$HWu3jVrbqFzr3uTk$BX-[N2\JZPπU".YegxPN,>F^k,]>G3_ko.$4ac5hg#E,Hc;_?6U.iRl$l*q=]:d,#JP3VY.Zvf?bπU"rr^*I65W9^&8FDb_04G/(w8>p9&HE)*m;-b5AF0;Pn&?9RR>R=#]6NartA%PoBeπU"mIff^\F&MT\gNT$q&Z(%ievbLQB#ZZPZZW>+LFR+.IsYELfG3;O3)Bq9Ay[>l?8πU"ma$8(VwJ/pwS(./B=aNLVE:ja6B];?y&'m&[75MwXifVAQm$*ed%DJ9INegS&luπU"dL3)6lZ_&&EM1m?EAMf\O6^wSg92HB.X-A:Pn<0(Eb3)CE'uPOZpAfdpQvCqsb-πU"k8ewc+SO4;ThiJ2n3'U7;fUz=S,N61C2Bxu%reKeoZq.5gD:\E#8&8M\g?fP+AMπU",E3pGOI3h:K1l%AzhSms*%To?G[BF]hX^gpXe;Ujfohqo]5(;_XSOehC#9r=XNOπU"jjaP*+:Mca4ElU02wk_m]wVQ)I6/H=b36Z>ZCc'_ux3M.20uZZc5xW2;i]Y<EuMπU"c-df3d9Uk>&Z1ax.IWV-3op7pXQ/;LR8:nl,>1$<rlB6vv^,V=;oJI[Jr&bU;NrπU"1&tUHH0U#dSIqbpTrIRrtzmZIR5\K1QDc=2d;wBa\cZPrQI-^sW0g9)v;H8Pj80πU"3P/q-HZ.J+=1EG3I#2p]OJJTrfR[;txm1-IOU;k[=p^.&896H_(3uB6((S2*f\(πU"/D9T&J#aDt(INTif__5yf%_L4*6B%WoNYPzo0z[zvM,'du-ieh-0%<DTO,#;\8JπU"Ais_wL'Xn#3n6#m#WZCM)C/-&W^8t*S4o#Y[oTBBW5&+Y=n2fH,]#P(RnKE]g6IπU"BYPTI#:VR'Zw0TICJ^3mE5GcjyIViRVb7-s6W4n-[ZJ'CfUGKX20.x+-<XS+9Q8πU"WNNhLy8,Gm_J67=l_/]ciG1n/]ln%gmTuRcfJA9awfWKK0?D^1o9aoFuY(*/$a)πU"()ErN7lxvA9a*7U*/7e?rcFe_+FNC;ZgRktn\cuil/evru(uPW9ic(9Xb'-dRiqπU"$q6m*fj6H)8pdpa0kM\X/Wd9MdO)ApfPRo&]>wesa>/(mb2uPzBe86H:?qaxVpsπU"T4CYW[>O0GhePpcUWwAOf[Hd&P?.Dv>z(nuG:ffDo,YE39)c9sa?by;6M1oif2iπU"BHSWb*:r,#6FXRD\cR.5]Be7N/[6Db9V]\x=bX\LS:J*f8Q0Km2L+hf6LG[PaV#πU"56nB6NJ5vF4[e-1q;xx#mRyK$*0/nrLq.9fJIPK/2UpU2vPVrVxCqo1q6dHl$o<πU"T1vWV#GtmIE],Jzw\x:9B+yOb6azT(pM4aP/qb-HPq#CV(KbBxaTM+XJEFAO&]]πU"Rd[cL0=]%vV65XT&do2uIMVlB>P+/Y]&u*gN&u%p()9%%%%-=%G'v.F%>k-f6*%πU"(%N6%%%.%%%%ijr%tWSgRfx6&;<>[kO5w-xEx09T\1S5R#Kl8C<&3)83I#/&bfQπU"z8^]0(g/Pr<xu;vsgZE'PS8gAvwUNXfhMHmllc0Ve.B#7+0m/&EQ:OUq>WKG>/8πU"m)dj*qcg7G>+U1CN3V;7w+TU>*uu8Cy&$g5C#]X:Yii9-HQJ<KSsF/J\BgKWfO^πU")SF3P8=BxW?SO#E(htE/\Lsk809[zcErWKnO0VQfQSH0e]b+8eW4KjY;*A0[pc,πU"K:4&Rn&$OgWZboh(7^0URrwhf>5w-_$TlaMeIQYE<]8TBe<<rZU?:jQUsu'^B1SπU"'D6+g9i4'-$7HA],]th/Y07Ccr63$to_)1^_%/ZwBYDG8S/YT?+D+RjL.MR.qIeπU"'dDwNoqhV?U+qux0bo4\HifTIR*>2p8ujcFYOLY===M9<GW_b>^N06Zm]qFi-IYπU":alcjL]kd*Gu0+VN>;vk>ig=fT-m\j<q:,_)v5x0<7'+EXFUZ-$b>,>D&:enTjLπU"dW9NqQKmY9>(1A:b32.DU/^=$wYfH_*aH6UZLd&7?7$?<]ZW[wC)g]u4qbx\;CZπU"&'Cgvp$:_f$2?K#?+O%FymRWlSE7[y<&Z2Hq[3:B>CDjB##Tq/^Ydb?SD9f9>9vπU"<Z6#dB$&C[7kSsn<nz$CZhJknZ,458)RSf9P>Z$T9JA/n)g4Q_2zr.Jpur>*\(1πU">HfFGkFJ'):m05p?8VeA+7s,XQg4M58/,GC=wE%/;uWd4)2f,pTB2vPy8OQDa\+πU"w=a(trBr.6jIU4eyITOOTJ1P=o%rSK/i*/l4(d?'Nf7zDLc[w7I>8KoJyxup.&.πU"kiv8y$7?-x%/52&CS&op*LUe(nB+,VhEoEV%cwDWDE$zo&B6=;v(:yAX\I#CscoπU"-,PcuF>SpY^wDbS%+r^.S,IV[rYX//N;wFQg])0gE[W^[6.OTcQxO#zEsygEQ?.πU"G-+:Z]+E0\7-42s';w;RJQzdR,el].c,>/&gDF/#,jrWmDpF.R4r3/n4Bm^2ivuπU"0UZU-)g/8//AKijI\[*rh9H95-(=2,<:YmA1&_8RTKNb&G)R_:KhkTGc3>UMr7sπU"l?U9;b/KndA>rGIy_mhhV-NYqoR8x??vV#UiC]9Ammc4nNTS^mk,$H2p$H/)bH'πU"8t#qWt=qKa,+q_Nq\5^xx.;XHfl:<0X)BUI,,$h3k*U_7o$2\7&^HIv.g#w+\/RπU"hY)$\rUDu,%Ek6Mgj^Chj$eNt6p:bKRbXSwM&L?WU00cI%\7K^JX^^0)yOdFcYvπU"f^:vE9kWT\sx7BWu#hBP3Gz-d$b5xKTep3JZwX&M>l03RW/:],sT/F0iJe8q#IPπU"iw.#;&m[q(f/-(iyaOcZLX?heZnHV9se^=P<j%loy=?r]B<EhW?OWBR^ACnlkPFπU")b/PA[-W33vYxiQnJvq8r.J\mzVL0#l#k&VLAVwEAJu.<VQCK8ZA_JXRnbDg\H9πU"/kp<H:kxb7tCo'yAk.Ck:0=NpV<D7E7#?NxdLP>/Vtdt\d7ZyZ?t-qhL7GmYV>MπU"ZC$^0>nuYJ;_'PX[MLqJ:.S%ICbd&vqoB^Fa\e2:)(ua?&bGtJ[%[rFJE_CN'8KπU"gsF:_JpA4fJel[UlJMd%^H3R3*2&Nt0vM2nN+(6m<?\jgTC2>.lSHP\+i\q3mb<πU"eg4Ph\;Z2hB[GWxa/u[UjH2L%(k#MG=%+7WFMl1kq_bz<19cFAs&imP>8qzLbT3πU"$)m45s;N/>?=f^Lo?+:15xizjY>cdDSh#3daQ3^O_G6\HO5e+dr?086gR(hR#1lπU")u-Xd,q]]3<#;MJ7V,d[#rMmEJLY^#g^LB=&S2AFba^Ch:FN'suI]?\^%LxA2XkπU"dm/pArq.SkgOyV.k6A8ieW/,S7S>+Xx'u%p()9%%%%-7%1'vFF^cN&_x&%(%M&%πU"%%1%%%%xhw%jjsV%XStg.oz^$%mHv9GUx$hOlAzYA<QQL*9?#fK;W3=77FG1)hXπU"vFa3+IV\=6<KLM'X3(E7HG+/jz=W:)*Xm5uKRS(//E[&r6A?W4D;QTukJHwh$?JπU"F7W<PM(&zCdD_6K1pjVgXO9_VYEBXE4hG2JesL^W&G+8hGUk*[rKXDeC:.5$(^YπU"]#$-Ns#KK.igqq1[%l97d/eF\J)NNCEVib*l1zl=&QZ5,+.PQ)1_OaN1s_VY5B\πU"Wtv3,O5]pk]bm=9q*LX($]tT&g[?6t'L0L'cQ^)A_2d=IjnC1wP%\-A?'P6+i'LπU"j,:?soR-+c>7IjP-vid]j2MvKgt7sw0LG1D(rNH2.Z=Apa]cD$0eTo[?Xg*r<#rπU":2'(IvRSfxu/iddf&OSvs2C3[+&PbwIt.T0O<L<OoB7L8aJ8aicV#6Z6fgaEju4πU"d8M(%up()%9%%%d-%('dvF*h-T>Z27%%r9%%%1%%%%xh%wjjs%VXSvRqgff)LGxπU"z5m#NnD==_8IR]/4A'KB$\x3zMR+=.e(h.wo(RL0YR*_FsT(9s5hAbqGXQN3RBnπU"gj?=v+Ga=EA3M:S'OR<;i7u;/x#6Ag&pDj,:#Ldk>U'ZNZbalvWbDo1TH,Zxhl;πU"YiHvmlltlls$$uGl2puD8%JI4A8XRu.McRKkq:B09I[+6V$PgusfLvYaf)=])P1πU"u3SM/OOb%)C-;R6:;9iWQ.&-,,e+4a*L<:VY?%U?+r4X:;UL<sPV7f;A,Dt/:w1πU"':P<.a&m+iHPLYb<iSa:,v9*J?.[Pld97=(=/Sm.(4RQ\_4o:[Ou*O.'TG'.a2mπU"(\*f55j/oP06:4oDek'69C*?.[2P:/7(mufxC'g358P^YC%UDa'AAe&'%3Oe2\7πU")/qC>G+;I'TQ&99CiKI])]Qk2YLi+#iVULFfX/+OqSm+',e'T6,TJ,ubeF.PRoOπU"8))keF.aW'88$q:9Q0W'$hOzi,LXujhZ\%S+&w.1&QXeW)(8B]73IBo'LeX]U'IπU":bn5PvxZ$xO65TsTp*F\$WYl77;qa6Q4>INU)l.IiWT$Z5o2MbIW4xFdLZ#p2NSπU"AOg5]\1GhAl>LwlFo.3J(ZJKm+X-BTc\atEn$jnb,*+k\B<4LuHfJB9j\YWG9'WπU"f72&4ckQ,zPLc0^qZ:]q:ZBgCn;ka-+P?em0NP)fxDnwh9>A3f/TrLM0Ktdz=ubπU"^f/r'$vBJd(A&2NYi]njQc*fMc>Sr6%kW8jS8hQW4mfQPQnfuPSf6JW;,G5TC+JπU"N>xnE-G4gvKrOg5PWG*2;VB-g1#?;0EgQW*Kj&:GOx-:3*4LibN4ANKi(acW3$jπU"acrY\X/fXTtp.,G*HlZv$XOL#^;0&AoH?m[adXwp;[cgr>Voj>V_)[=xkK0JrJSπU"8k0k7;Bv#:_1R76r_x8A2YTIHTIxL).__agTI&MTOtgPZa5p?,^3rs9L'l.Yx#iπU"sijy#U=]Ta/#6jcE)T[9^'$/n9HrI:a:NAC:;YrAVG&Ao$3p+p)>Ym1geX9HTC:πU"io$g\,ph:w3(P(YlG$D,pIY1),p>:9HJ:/in$S)&7;jMmDT;:9HS:0s&\cL>DT5πU"ELw'hChrr_R9?&RKUrr=*A+?R&^CF?Wtk-JG,P],L8Cly6dmgGYboW?$w\8+A;UπU"wvsRG)DM97.ce7EN7fnXNg8#^J5IzP4D/XvDni4\UG+IBu?$wz#4I81z;A,<y*IπU"GJ2VI\3,m8xZ4tmBqFv.KZF'Y.e'Il*-3m7$\mx^IrjuJWGF;UUaXKpG&G,&FLiπU"(,AiPal.[Jvawu>^mlJZd?-31p%cpB(S#N#epmjs<P0S)mWs09irJ9p#hD+fT=qπU"oWB?Te6;:b?#<#73EIWXLI,hqMKQdesW,R]]T'RjB#3KnHDYoc[/,VHML#nZ$tKπU")&jPL%tQV7d:$RBG7LB&:Aj=>ZxpYA4+(qGV:b)^;ss47mRc\/1B?SPq=w8PX+fπU"/5/CLW#U(v?x6&:RUVzZ02)1)\Z.fz[N)9AlI(s*k,4H^JN0c+2nuRqWCbdwmCqπU"R5x$6*Nxh>z<j\XQS&3Ssr<xAv4o6:Ths,g3iI_-S<Tv]qa22K].Hce[o+IMXVIπU"Ghc;e<cfou9Pms:JuhbJjL\KULHS)N9fK4?*0RMtp8mjoM8AW^Ur.^8*Px(L?h9πU"&.7Wx^c_iWpvNrw=9'\mobR9jL2RXN1LoifQ1RkuojGOk]gJ?p4-$JP_b]1w5JGπU"YuIlWCb;GZVJwEd?o^oC18dc:sHNGYm]W/3;2XJ98M]3b8%2XDSLNv:=J*\4Ma9πU"]Fg=d:JThl'cq&i''W5CK\Av&s2l3&QS473e=R4R^FAC1m$7PL]/^oo8k]f+GD.πU"%7;xL<lv]%jHiol*6&TmyA%=oXwuAgPYcsr4\<4gk_^'G^e8'$Q:c<Dm.O%TLZLπU"DSDMnRfjbA+Mmgh)M157X^nqST&4/,NA12cZ[j,tY3&g[BI=MEe_c9HgQs&eXjAπU"nsviE$0-Jki<0JfaQ[8y0Hxnu[I0V0FFoimMkWM-4]I6kAv9q-Zowj]&6v233y_πU"f%K-?f1[[T(<mHkP).AD0ru;r6+O]r8EQ3Q4Oam[C^sb2$*FnSlW6uh3Vu0rYUlπU"v2S10.d#3)4/owhxl5LJ2M<YFuLL$6.?foJ6Jut9vYkPY^jd8'T-&/K/hjMRRrXπU"VLuo1X%'U-o3-DF$aBNS8JxRMG[x4t#1Vk<ueioFa2HTcc;/CUx=>%<Xq_=^$B8πU"Di;ZxKu0)\16mM\/ukZ7ooDbJak]Alc2T]PN\vl3[nOBC\_FGlLQ*HPNHTSND.SπU"\EGL3=9F=Jg*F].UvvEsp'rhaoVjb.tx]OCnQ8&e\jblTNfw9.dgF9TvkrJZIXgπU"nvHSX)pKiZG>VMx\v,UfYs]*-=a_)=;K4GQhkLV,^Nkr\J;_68GkR^jcHR'GU;AπU"o2oGC]eFFG;B5eB(;S63GAU^*;((C6p^?D$ev'G/^Pl_%S,OwGkkqd#_[W%k,dYπU"k&[;CZ6zkgzB%<J(R6Dtk&Z%YP,.kZ&\%$W,5G)1^J[X^T6cGX9Gukd*]:\We#GπU"Mc:RkGU[#/hc,$^TH;R0k><\ejlGwi,rfk6=lRDkfE_;46W(#/fZ,8^;Ld6>#qEπU"_,0s^d_ep56x90R$kBHZeM6VLknB=[9RV'G+^$oG>otGLG]6LD?EiK,XklH^eA6πU"T$^tW<,0GSn?[;Ri#kL;lR8?oF$GSAKoN6fj]tk,PN^;[K,-6&s]4?RV&kvX-,dπU"]V[7U(]#^?,_$ew:UR'7:.Za$jEs$JGlNQh.RH4-BqJ8y-c:z-]M+TGOTMEc66_πU"d6$C2f5dT)D3<R)*%yMpxev8sDlT=?Xxw>VjY<;Tm\Gu-XI)Crrjj,itw4,?i>'πU"+337yi.H(Tr]0>Y6h9AXshS8yIOnV=eLAqMzX9,HanMNsH\$OivpC8'I.*wpusKπU">[]+obgp/t9p:Salmzqa1\(Gb_.J,jmXvoXE&#D^C(Dpo8;7jz3&Q/Fmd+gR&5SπU"URtBiEgbW-6Nmoi]fikc;$5S\,rWLGO#bLxOoMVtYB$-E>nbod=of)#&8g?G=r(πU"d?)d[+r-\E.g8>ZDg;6i&g0hYn:6f_h(,qx'XbXsH_J..DgETS;gJ\g&igPSIEUπU".sF2T&^fUp[^#Eh8Xi'X\\8)oq\af4_Fdg30h.<NsYHnZI6_DGqx&BrY4&vj6ljπU";CcWa8qI)E<gqngLROYx6q5(Q8aY#.t&S^Rns#hXF<MzrJ^aFYt(RAQDLnA^7;NπU"V5xWa^]v5TGf\j-FaT8T;DRsgD]8C<)N&SYa%dpPS/B9H-t+c6xkrm<g0aM#QIkπU"+bkxgupdo<*k*g,3]nY]+DA,iZv5uyrIZkH)TMSdaNm4kQ\*LbJRg\e:zqX99DPπU"[y5jaE0j.vp>>YtDi;BD649oOa')ZeV8FRKZ&BPlR#*q69T\Ep'npf,aPU4,&:bπU"t'z3ZObSoV:b'^rbya3,-P2;eh+oHOE7uyguX-96q#o$]Yd+ttz3gNlnhCV;^ESπU"dHMVgXTUzWD]NoH2Y:PP%C,9Z<suAV]_87K0u(NLOT%>VmpK.6gVAJu\=c>\zFMπU",]B,X\&$XqN3zGIF_n'+sPY%YP^p9DuKb62DkpcUDB^TDv':ZnOs9F:CS?2qF-vπU"NbyQtAT3]iiv\\Nh:9zP1v#EvBjo]l-.C/l5o/(6TV9(v%:d_BQD>o(&tP/BhttπU"c43M()w^'#.Ba<.OpDYQW^oPLsr4?cjbS'H_mSbzf8t;%K_DWArZ-(&Z;QS\*&'πU"\vam^eB2F6BEu^a^1y25:6-tJ\\%7#iwipDxtK%G7o\X2pk^\p^:dJ5(=?SANY4πU"BCeweRf0*XM5)/7h&I?:InwJYNIOmLz]'o:_/n>*kDE;>qbELPoYo3'pK2sSxM=πU"y8;BO0c<8+\op)x8--qj&jt;9:-GpKo4.2<?J:]Jnp,Q(ZX)2[dr4MQ9\epP^KKπU"ic:T<^6jioLrN<L)2ZmyJbl(RIgz:%Q/ThhRJ[6p[v#2B-52s9=(.WKcHS;hQ0.πU"U5:vzlyW\YbYGeSSGs:mLD'Q4AG9fQMZ1Y9z;pfTwR&?XSoJIqc)D91s[W]:IA*πU"g=.YfOZIc?n9s^ASVuzpro.7+.$nPNq)2&V<jV=&N8sg[edRWlsc>$jzP'(m#(]πU"E(SD]/XD)#]$-rU#+nRj^O]<qmqj(cG3B+mN(/(sL+:'MMDogN*5+j9+Bq_->D;πU"OTYfRM5\3dokQoJsmO.XRS/)f4;91942q<6OpcQ9PPB;fhvM^^&SDmOO9L'dd%uπU"%p&'9%%9%%%%-%L](vF+oEVP)%)%%z%0%%.%%%%%%%%%&%%E%%%%%%%%%ijr%tVπU"Sg%fxup%&'9%%9%%%m-%G'#vF%>=kf6*.%%N6%%%.%%%%%%%%%&%%E%%%'P)%%%πU"ijrt%WSgf%xup&%'9%9%%%%-7%1'vFF^cN&_x&%(%M&%%%1%%%%%%%%%&%E[%%%πU"4%/%%x%hwjj%sVXS%tgou%p&'9%%9%%#%-%(B'vF*?hT>Z[2%%r%9%%1%%%%%%%πU"%%%%%E%%%%]1%%%xhw%jjsV%XSvq%gup*%+%%%%%)%)+%[%%(%f>%%%%%πEND SUBπCLOSE:IF S=68AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπJoshua Dickerson FAST CLIP PUTTING FidoNet QUIK_BAS Echo 10-14-96 (16:25) QB, QBasic, PDS 55 1337 CLIPPUT.BAS DECLARE SUB ClipPut (x%, y%, BitMap%())πDEFINT A-ZπSCREEN 13πDEF SEG = &HA000ππFOR i = 0 TO 63π OUT &H3C8, iπ OUT &H3C9, iπ OUT &H3C9, iπ OUT &H3C9, iπNEXTππDIM a(4097)πa(0) = 63πa(1) = 63πFOR y = 0 TO a(1)π FOR x = 0 TO a(0)π a(y * (a(0) + 1) + x + 2) = (x * y) MOD 64π NEXTπNEXTππt! = TIMERπFOR x = -30 TO 320π ClipPut x, 0, a()πNEXTπPRINT (350) / (TIMER - t!)πa$ = INPUT$(1)ππSUB ClipPut (x, y, BitMap())π tX = x + BitMap(0)π tY = y + BitMap(1)π π IF 0 < tX AND x <= 319 AND 0 < tY AND y <= 199 THENπ IF x < 0 THEN MnClipX = -xπ IF tX > 319 THEN MxClipX = 319 - x ELSE MxClipX = BitMap(0)π IF y < 0 THEN MnClipY = -yπ IF tY > 199 THEN MxClipY = 199 - y ELSE MxClipY = BitMap(1)ππ Index = (BitMap(0) + 1) * MnClipY + 2π sM& = 320& * (y + MnClipY) + xπ FOR bY = MnClipY TO MxClipYπ FOR bX = MnClipX TO MxClipXπ c = BitMap(Index + bX)π IF c > 0 THEN POKE sM& + bX, cπ NEXTπ Index = Index + BitMap(0) + 1π sM& = sM& + 320π NEXTπ END IFπEND SUBππ' This is meant to be compiled, but I will convert this to ASM complete withπ'a basic loader which will put it in an array to be CALLed.. It is slightlyπ'faster than the routine employed by Eric Carr.. (Which was pretty darn fast..π':-) )πBen Kaashoek STARFIELD SIMULATION robertk@worldaccess.nl 10-19-96 (10:23) QB, QBasic, PDS 177 8006 STARSIM.BAS 'Check out the difference in speed when you turn DEFINT A-Z off !!!!πDEFINT A-Z 'Use integers as default for speed.ππ'The starfield code itself is not mine.π'When I got it however, it needed some speeding up. First of all I added theπ'DEFINT A-Z statement. (I use this in all my programs.)π'I also found some unnessesarry statement's and removed those too.π'Then. A friend came with a rather interresting suggestion.π'"Hey, why not add something like a comet?", "Ok, I'll try it."π'I was a little suprised when it actually worked.π'The comet code probably needs some fine-tuning (it's only in there for a dayπ'or so. But I'm sure somebody can find it usefull.π'Oh, almost forgot. Many thanks to the original author. I hope you recognizeπ'YOUR piece of the work.π' BEN.ππTYPE StarDataπ xPos AS INTEGER 'X position of a star.π yPos AS INTEGER 'Y position of a star.π Speed AS INTEGER 'Speed of star (Parallax effect).π Colour AS INTEGER 'Colour of a star.πEND TYPEππTYPE CometDataπ xPos AS INTEGER 'X position of a comet.π yPos AS INTEGER 'Y position of a comet.π xSpeed AS INTEGER 'Speed of comet in X direction.π ySpeed AS INTEGER 'Speed of comet in Y direction.π Visible AS INTEGER 'Is comet visible.π TailSize AS INTEGER 'Length of tail in pixels.πEND TYPEππCONST False = 0: True = NOT False 'Boolean constants.ππ'--- Program settings. ------------------------------------------------------πStars = 100 'Number of stars to plot ?π 'Adjust if starfield gets "animated"π '286/20 => 100 and P100 => 600.πUseRetrace = True 'Use retrace in VGA modes ?πCometSeed = 100 'Create comet every ... frames.πCometHeadColor = 14 'Colour of the comet's head.πCometTailColor = 4 'Colour of the comet's tail.πScrMode = 12 'Which screenmode to use ?π'--- End program settings. --------------------------------------------------ππComets = 1 'Number of comet's (KEEP ON 1 !!!)πOPTION BASE 1 'Start array's with element 1.πREDIM Comet(Comets) AS CometData 'Create array for comet'sπREDIM StarField(Stars) AS StarData 'Create array's for stars.πREDIM OldStarField(Stars) AS StarDataππSELECT CASE ScrMode 'Determine screen boundaries.π CASE 0π PRINT "Sorry, graphic modes only! Maybe next time."π END 'See ya later.π CASE 7 'EGA 320x200π HorLimit = 320π VerLimit = 200π UseRetrace = False 'Disable using retrace as delay.π CASE 8 'EGA 640x200π HorLimit = 640π VerLimit = 200π UseRetrace = False 'Disable using retrace as delay.π CASE 9 'EGA 640x350π HorLimit = 640π VerLimit = 350π UseRetrace = False 'Disable using retrace as delay.π CASE 12 'VGA 640x480π HorLimit = 640π VerLimit = 480π CASE 13 'VGA 320x200π HorLimit = 320π VerLimit = 200π CASE ELSE 'Anything that's NOT tested.π PRINT "Unsupported videomode."π END 'See ya later.πEND SELECTππ'Initialize program.πSCREEN ScrMode: RANDOMIZE (TIMER)ππ'Fill array with random stars...πFOR I = 1 TO Stars 'Fill 'er up.π StarField(I).xPos = INT(RND * HorLimit + 1)π StarField(I).yPos = INT(RND * VerLimit + 1)π StarField(I).Speed = INT(RND * 8 + 1)π OldStarField(I).xPos = INT(RND * HorLimit + 1)π OldStarField(I).yPos = INT(RND * VerLimit + 1)π OldStarField(I).Speed = INT(RND * 8 + 1)π SELECT CASE OldStarField(I).Speedπ CASE 0 TO 3: OldStarField(I).Colour = 8π CASE 4 TO 7: OldStarField(I).Colour = 7π CASE 8: OldStarField(I).Colour = 15π END SELECTπ SELECT CASE StarField(I).Speedπ CASE 0 TO 3: StarField(I).Colour = 8π CASE 4 TO 7: StarField(I).Colour = 7π CASE 8: StarField(I).Colour = 15π END SELECTπNEXT Iππ'Fill array with random comet...πComet(1).xPos = INT(RND * HorLimit + 1) 'Pick a random X position.πComet(1).yPos = 1 'Always start on the top line.πComet(1).xSpeed = INT(RND * 4 + 2)πComet(1).ySpeed = INT(RND * 3 + 2)π'50% of the time the direction of the comet will be altered.πIF INT(RND * 2) = 0 THEN Comet(1).xSpeed = -Comet(1).xSpeedπComet(1).TailSize = INT(RND * 20 + 5)ππDOπ IF INT(RND * CometSeed) = 1 AND NOT CometStart THEN CometStart = -1π FOR I = 1 TO Stars 'Replot all the stars.π PSET (StarField(I).xPos, StarField(I).yPos), 0π StarField(I).xPos = StarField(I).xPos - OldStarField(I).Speedπ π IF StarField(I).xPos <= 1 THEN 'Recalculate if star hits lower limit.π StarField(I).xPos = HorLimitπ StarField(I).yPos = INT(RND * VerLimit + 1) 'Give star new y position.π END IFπ π 'Enable the lines below if you plan on having a left -> right effect.π 'IF OldStarField(i).xPos >= HorLimit THEN 'Recalculate if star hits higher limit.π ' OldStarField(i).xPos = 1π ' OldStarField(i).yPos = INT(RND * VerLimit + 1) 'Give star new y position.π 'END IFπ π 'Put the star on screen at it's modified position.π PSET (StarField(I).xPos, StarField(I).yPos), StarField(I).Colourπ NEXT Iππ 'Replot comet (This part is needed when the head is NOT off the screen.)π IF CometStart AND NOT CleanTail THENπ PSET (Comet(1).xPos, Comet(1).yPos), CometTailColorπ Comet(1).xPos = INT(Comet(1).xPos + Comet(1).xSpeed)π Comet(1).yPos = INT(Comet(1).yPos + Comet(1).ySpeed)π IF Comet(1).xPos >= HorLimit OR Comet(1).xPos <= 1 OR Comet(1).yPos >= VerLimit THENπ CleanTail = True 'Start removing the tail.π ELSEπ PSET (Comet(1).xPos, Comet(1).yPos), CometHeadColorπ TailxPos = Comet(1).xPos - INT(Comet(1).TailSize * Comet(1).xSpeed)π TailyPos = Comet(1).yPos - INT(Comet(1).TailSize * Comet(1).ySpeed)π IF TailxPos >= 1 AND TailyPos >= 1 THEN PSET (TailxPos, TailyPos), 0π END IFπ END IFπ 'Remove the rest of the tail if the head is moved off the screen.π IF CleanTail THENπ TailxPos = INT(Comet(1).xPos - Comet(1).TailSize * Comet(1).xSpeed)π TailyPos = INT(Comet(1).yPos - Comet(1).TailSize * Comet(1).ySpeed)π Comet(1).TailSize = Comet(1).TailSize - 1π IF TailxPos >= 1 AND TailyPos >= 1 THEN PSET (TailxPos, TailyPos), 0π π 'Create a new comet.π IF TailxPos >= HorLimit OR TailxPos <= 1 OR TailyPos >= VerLimit THENπ Comet(1).xPos = INT(RND * HorLimit + 1) 'Pick a random X position.π Comet(1).yPos = 1 'Always start on the top line.π Comet(1).xSpeed = INT(RND * 4 + 2)π Comet(1).ySpeed = INT(RND * 3 + 2)π IF INT(RND * 2) = 0 THEN Comet(1).xSpeed = -Comet(1).xSpeedπ Comet(1).TailSize = INT(RND * 20 + 5)π CometStart = Falseπ CleanTail = Falseπ END IFπ END IFππ 'Using the Vertical Retrace (VGA+ only) keeps the program from beingπ 'affected by the number of stars to print. If you use 100 or 500 stars onπ 'a P100 doesn't matter. The VR will keep everything going at the same speed.π '(Within certain boundaries). This method works great when used on anythingπ 'faster then my old 286 :-). I think it has something to do with theπ 'frequency of the monitor. SVGA's have a much smoother parallax effect.ππ IF UseRetrace THEN WAIT &H3DA, 8 'Wait for VGA vertical retrace.ππ 'Put your nice scrolly or something over here.π 'LOCATE 14, 30: PRINT "Starfield Simulation..."πLOOP UNTIL INKEY$ <> ""πKurt Kuzba DEMYSTIFY SCREEN SAVER FidoNet QUIK_BAS Echo 06-11-96 (00:00) QB, QBasic, PDS 55 2548 DEMYST.BAS 'I synched the program execution to the vertical retrace.π'This keeps the display speed constant on nearly any system.π'_|_|_| DEMYST.BASπ'_|_|_| A program that demystifies the mystify screen saver.π'_|_|_| No warrantee or guarantee is given or implied.π'_|_|_| Released to PUBLIC DOMAIN by Kurt Kuzba. (6/11/96)πDEFINT A-ZπSCREEN 12: RANDOMIZE (TIMER * 1000)πTYPE IntersectPointsπ x AS INTEGER: y AS INTEGER: dx AS INTEGER: dy AS INTEGER: END TYPEπDIM lnx(60) AS IntersectPointsπlnx(0).x = 0: lnx(0).y = 0: lnx(0).dx = 0: lnx(0).dy = 0πFOR T = 1 TO 59: lnx(T) = lnx(0): NEXTπDOπ WHILE ((INP(&H3DA)) AND 8) <> 0: WEND 'Here's where I keep the speedπ WHILE ((INP(&H3DA)) AND 8) = 0: WEND 'constant for almost all systemsπ FOR L = 0 TO 5π IF lnx(L).x < 1 THEN lnx(L).dx = 2 + ((RND * 999) MOD 4)π IF lnx(L).y < 1 THEN lnx(L).dy = 2 + ((RND * 999) MOD 4)π IF lnx(L).x > 638 THEN lnx(L).dx = -(2 + ((RND * 999) MOD 4))π IF lnx(L).y > 478 THEN lnx(L).dy = -(2 + ((RND * 999) MOD 4))π lnx(L).x = lnx(L).x + lnx(L).dx: lnx(L).y = lnx(L).y + lnx(L).dyπ NEXTπ FOR L = 0 TO 5π IF (L MOD 3) <> 0 THENπ S = L + 54: F = ((L + 1) MOD 6) + 54π LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 0π END IFπ S = L + 48: F = ((L + 1) MOD 6) + 48π LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 1π S = L + 42: F = ((L + 1) MOD 6) + 42π LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 1π S = L + 36: F = ((L + 1) MOD 6) + 36π LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 1π S = L + 30: F = ((L + 1) MOD 6) + 30π LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 9π S = L + 24: F = ((L + 1) MOD 6) + 24π LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 9π S = L + 18: F = ((L + 1) MOD 6) + 18π LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 11π S = L + 12: F = ((L + 1) MOD 6) + 12π LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 11π S = L + 6: F = ((L + 1) MOD 6) + 6π LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 15π E = (L + 1) MOD 6π LINE (lnx(L).x, lnx(L).y)-(lnx(E).x, lnx(E).y), 15π NEXTπ FOR L = 0 TO 5π lnx(L + 54) = lnx(L + 48): lnx(L + 48) = lnx(L + 42)π lnx(L + 42) = lnx(L + 36): lnx(L + 36) = lnx(L + 30)π lnx(L + 30) = lnx(L + 24): lnx(L + 24) = lnx(L + 18)π lnx(L + 18) = lnx(L + 12): lnx(L + 12) = lnx(L + 6)π lnx(L + 6) = lnx(L): NEXTπLOOP WHILE INKEY$ = "": SCREEN 0π'_|_|_| end DEMYST.BASπKurt Kuzba SHOW ALL COMBINATIONS OF COLORSFidoNet QUIK_BAS Echo 10-01-96 (08:28) QB, QBasic, PDS 74 2161 ALLHUES.BAS '> > Actually, that's wrong. You only have 256k (262,000),π'> > or 63 times 63 times 63. That's the max for your RGBπ'> > values.π'> Actually, it's 64 times 64 times 64, because there are 64π'> degrees, not 63.π'> Count all the numbers from 0 to 63 inclusively.π'>..........π' Correct.π'Total number of colors possible is 64^3, or 262,144 colors.π'For those who wish to count them...π'( If anybody actually runs all the way through this programπ' without hitting a key, they must be something other thanπ' human :)ππ'_|_|_| ALLHUES.BASπ'_|_|_| A display of all the possible color, 8 at a time.π'_|_|_| Hit a key to quit if you like. Produces 262,144 colors.π'_|_|_| No warrantee or guarantee is given or implied.π'_|_|_| Released PUBLIC DOMAIN by Kurt Kuzba. (10/1/96)πRANDOMIZE TIMERπSCREEN 12πSCREEN 0πCOLOR 7, 0πCLSπFOR L% = 2 TO 6π LOCATE L%, 1π FOR C% = 8 TO 15π COLOR C%π PRINT STRING$(10, CHR$(219));π NEXTπNEXTπCOLOR 7, 0πColour% = 0πDIM CRED(64) AS INTEGERπDIM CGRN(64) AS INTEGERπDIM CBLU(64) AS INTEGERπFOR t% = 0 TO 64π CRED(t%) = t%π CGRN(t%) = t%π CBLU(t%) = t%πNEXTπ'_|_|_| Thanks to Bill White, ( of Miami :), for theπ'_|_|_| neat shuffle routine.πFOR t% = 1 TO 128π SWAP CRED(t% AND 63), CRED(RND * 63)π SWAP CGRN(t% AND 63), CGRN(RND * 63)π SWAP CBLU(t% AND 63), CBLU(RND * 63)πNEXTπFOR RED% = 0 TO 63π FOR GRN% = 0 TO 63π FOR BLU% = 0 TO 63π WAIT &H3DA, 8: WAIT &H3DA, 8, 8π hue% = 56 + (BLU% AND 7)π OUT &H3C8, hue%π OUT &H3C9, CRED(RED%)π OUT &H3C9, CGRN(GRN%)π OUT &H3C9, CBLU(BLU%)π LOCATE 1, 1π Colour& = Colour& + 1π Colr$ = MID$(STR$(Colour&), 2)π txt$ = ""π p% = LEN(Colr$)π FOR t% = 1 TO p% - 1π txt$ = MID$(Colr$, p% - t%, 1) + txt$π IF t% MOD 3 = 0 THENπ IF t% < (p% - 1) THEN txt$ = "," + txt$π END IFπ NEXTπ PRINT txt$π IF INKEY$ <> "" THEN SCREEN 12: SCREEN 0: ENDπ NEXTπ NEXTπNEXTπ'_|_|_| end ALLHUES.BASπDouglas H. Lusher ROTATING 3D CYLINDER & SPHERE comp.lang.basic.misc 10-22-96 (17:52) QB, QBasic, PDS 276 8552 3DCYLIND.BAS'this is code to draw and rotate a 3-d image of a cylinderπ' and a sphere.π'by Douglas H. Lusher, October 1996πDECLARE SUB DrawPoly (X%(), Y%(), Vertices%, Culler%)πDECLARE FUNCTION KeyPress% ()πCONST Green = 2, White = 15πCONST ESC = 27πCONST HomeKey = -71, EndKey = -79πCONST UpArrow = -72, DnArrow = -80πCONST LArrow = -75, RArrow = -77π'the home key brings the object toward the viewer, the end keyπ' takes it away from the viewer.π'the up arrow moves the object up, the down arrow moves it down,π' the right arrow moves it right, the left arrow moves it left.π'pressing "y","p", or "r" increases yaw, pitch and roll respectively.π' pressing the uppercase of these letters decreases the values.πRANDOMIZE TIMERπAPage% = 1: VPage% = 0πSCREEN 9, , APage%, VPage%πScrnWid% = 640: ScrnHgt% = 350πCtrX% = ScrnWid% \ 2: CtrY% = ScrnHgt% \ 2πAspectRatio! = 4 * (ScrnHgt% / ScrnWid%) / 3πPi! = ATN(1) * 4!ππDO: R1! = RND: LOOP UNTIL R1! < .628: R1! = R1! * 10!πDO: R2! = RND: LOOP UNTIL R2! < .628: R2! = R2! * 10!πDO: R3! = RND: LOOP UNTIL R3! < .628: R3! = R3! * 10!π'R1! = 0: R2! = 0: R3! = 0πD! = 1200πMX! = 0: MY! = 0: MZ! = -350πInc! = .02πRInc! = -Inc!πPInc! = -Inc!πYInc! = -Inc!ππGOSUB InitCylinderπ'GOSUB InitSphereππ'MainLoopπDOπ SELECT CASE KeyPress%π CASE 0π CASE UpArrow: MY! = MY! + 10!π CASE DnArrow: MY! = MY! - 10!π CASE LArrow: MX! = MX! + 10!π CASE RArrow: MX! = MX! - 10!π CASE HomeKey: MZ! = MZ! + 10!π CASE EndKey: MZ! = MZ! - 10!π CASE ASC("r")π RInc! = RInc! + Inc!: IF RInc! > 1 THEN RInc! = 1π CASE ASC("R")π RInc! = RInc! - Inc!: IF RInc! < -1 THEN RInc! = -1π CASE ASC("y")π YInc! = YInc! + Inc!: IF YInc! > 1 THEN YInc! = 1π CASE ASC("Y")π YInc! = YInc! - Inc!: IF YInc! < -1 THEN YInc! = -1π CASE ASC("p")π PInc! = PInc! + Inc!: IF PInc! > 1 THEN PInc! = 1π CASE ASC("P")π PInc! = PInc! - Inc!: IF PInc! < -1 THEN PInc! = -1π CASE ESC: EXIT DOπ END SELECTπ R1! = R1! + YInc!: IF R1! > 6.28 THEN R1! = 0π R2! = R2! + RInc!: IF R2! > 6.28 THEN R2! = 0π R3! = R3! + PInc!: IF R3! > 6.28 THEN R3! = 0π SR1! = SIN(R1!): CR1! = COS(R1!)π SR2! = SIN(R2!): CR2! = COS(R2!)π SR3! = SIN(R3!): CR3! = COS(R3!)π CLSπ GOSUB DrawCylinderπ 'GOSUB DrawSphereπ SWAP APage%, VPage%π WAIT &H3DA, 8π SCREEN , , APage%, VPage%πLOOPπSCREEN 0: WIDTH 80πENDπ πPerspectiveCalculations:πX! = -X!πXA! = CR1! * X! - SR1! * Z!πZA! = SR1! * X! + CR1! * Z!πX! = CR2! * XA! + SR2! * Y!πYA! = CR2! * Y! - SR2! * XA!πZ! = CR3! * ZA! - SR3! * YA!πY! = SR3! * ZA! + CR3! * YA!πX! = X! + MX!πY! = Y! + MY!πZ! = Z! + MZ!πSX% = CINT(D! * X! / Z!) + CtrX%πSY% = CINT(D! * Y! / Z! * AspectRatio!) + CtrY%πRETURNππCheckVisibility:π'plane equation method of hidden surface removalπSP1! = -X1! * (Y2! * Z3! - Y3! * Z2!)πSP2! = X2! * (Y3! * Z1! - Y1! * Z3!)πSP3! = X3! * (Y1! * Z2! - Y2! * Z1!)πVisibleSurface% = ((SP1! - SP2! - SP3!) <= 0)πRETURNππ'========================================================================πInitCylinder:πL! = 40! 'half the length of the cylinderπR! = 20! 'the radius of the cylinderπDivs% = 18 'the number of steps around the cylinderπStepAmount! = (Pi! * 2!) / CSNG(Divs%)πS1% = 1: S2% = Divs% \ 3: S3% = S2% + S2%πREDIM X1!(1 TO Divs% + 1), X2!(1 TO Divs% + 1)πREDIM Y1!(1 TO Divs% + 1), Y2!(1 TO Divs% + 1)πREDIM Z1!(1 TO Divs% + 1), Z2!(1 TO Divs% + 1)πREDIM SX1%(1 TO Divs% + 1), SY1%(1 TO Divs% + 1)πREDIM SX2%(1 TO Divs% + 1), SY2%(1 TO Divs% + 1)πREDIM X%(1 TO 4), Y%(1 TO 4)πXtra% = Divs% + 1πRETURNππDrawCylinder:πR5! = 0πFOR T% = 1 TO Divs%π XX! = SIN(R5!) * R!: YY! = COS(R5!) * R!π 'one end of cylinderπ X! = XX!: Y! = YY!: Z! = L!π GOSUB PerspectiveCalculationsπ X1!(T%) = X!: Y1!(T%) = Y!: Z1!(T%) = Z!π SX1%(T%) = SX%: SY1%(T%) = SY%π 'other end of cylinderπ X! = XX!: Y! = YY!: Z! = -L!π GOSUB PerspectiveCalculationsπ X2!(T%) = X!: Y2!(T%) = Y!: Z2!(T%) = Z!π SX2%(T%) = SX%: SY2%(T%) = SY%π R5! = R5! + StepAmount!πNEXTπX1!(Xtra%) = X1!(1): X2!(Xtra%) = X2!(1)πY1!(Xtra%) = Y1!(1): Y2!(Xtra%) = Y2!(1)πZ1!(Xtra%) = Z1!(1): Z2!(Xtra%) = Z2!(1)πSX1%(Xtra%) = SX1%(1): SX2%(Xtra%) = SX2%(1)πSY1%(Xtra%) = SY1%(1): SY2%(Xtra%) = SY2%(1)πFOR Q1% = 1 TO Divs% 'draw the side polygons of the cylinderπ Q2% = Q1% + 1π X1! = X1!(Q1%): Y1! = Y1!(Q1%): Z1! = Z1!(Q1%)π X2! = X1!(Q2%): Y2! = Y1!(Q2%): Z2! = Z1!(Q2%)π X3! = X2!(Q2%): Y3! = Y2!(Q2%): Z3! = Z2!(Q2%)π GOSUB CheckVisibilityπ IF VisibleSurface% THENπ X%(1) = SX1%(Q1%): Y%(1) = SY1%(Q1%)π X%(2) = SX1%(Q2%): Y%(2) = SY1%(Q2%)π X%(3) = SX2%(Q2%): Y%(3) = SY2%(Q2%)π X%(4) = SX2%(Q1%): Y%(4) = SY2%(Q1%)π CALL DrawPoly(X%(), Y%(), 4, White)π END IFπNEXTπ'draw one endπX1! = X1!(S1%): Y1! = Y1!(S1%): Z1! = Z1!(S1%)πX2! = X1!(S3%): Y2! = Y1!(S3%): Z2! = Z1!(S3%)πX3! = X1!(S2%): Y3! = Y1!(S2%): Z3! = Z1!(S2%)πGOSUB CheckVisibilityπIF VisibleSurface% THENπ CALL DrawPoly(SX1%(), SY1%(), Divs%, White)πEND IFπ'draw the other endπX1! = X2!(S1%): Y1! = Y2!(S1%): Z1! = Z2!(S1%)πX2! = X2!(S2%): Y2! = Y2!(S2%): Z2! = Z2!(S2%)πX3! = X2!(S3%): Y3! = Y2!(S3%): Z3! = Z2!(S3%)πGOSUB CheckVisibilityπIF VisibleSurface% THENπ CALL DrawPoly(SX2%(), SY2%(), Divs%, White)πEND IFπRETURNππ'========================================================================πInitSphere:πR! = 40! 'the radius of the sphereπDivs% = 18πStepAmount! = (Pi! * 2!) / CSNG(Divs%)πREDIM X1!(1 TO Divs% + 1), X2!(1 TO Divs% + 1)πREDIM Y1!(1 TO Divs% + 1), Y2!(1 TO Divs% + 1)πREDIM Z1!(1 TO Divs% + 1), Z2!(1 TO Divs% + 1)πREDIM SX1%(1 TO Divs% + 1), SY1%(1 TO Divs% + 1)πREDIM SX2%(1 TO Divs% + 1), SY2%(1 TO Divs% + 1)πREDIM X%(1 TO 4), Y%(1 TO 4)πXtra% = Divs% + 1πRETURNππDrawSphere:π'north polar areaπ'R5! = 0: X! = SIN(R5!) * R!: Y! = COS(R5!) * R!: Z! = 0πX! = 0!: Y! = R!: Z! = 0πGOSUB PerspectiveCalculationsπX3! = X!: Y3! = Y!: Z3! = Z!πX%(3) = SX%: Y%(3) = SY%πR5! = StepAmount!: GOSUB CalcAroundπFOR Q1% = 1 TO Divs%π Q2% = Q1% + 1π X1! = X2!(Q2%): Y1! = Y2!(Q2%): Z1! = Z2!(Q2%)π X2! = X2!(Q1%): Y2! = Y2!(Q1%): Z2! = Z2!(Q1%)π GOSUB CheckVisibilityπ IF VisibleSurface% THENπ X%(1) = SX2%(Q2%): Y%(1) = SY2%(Q2%)π X%(2) = SX2%(Q1%): Y%(2) = SY2%(Q1%)π CALL DrawPoly(X%(), Y%(), 3, Green)π END IFπNEXTππ'middle of sphereπR5! = StepAmount!πFOR T2% = 1 TO (Divs% \ 2) - 2π FOR Q1% = 1 TO Divs% + 1π X1!(Q1%) = X2!(Q1%): Y1!(Q1%) = Y2!(Q1%): Z1!(Q1%) = Z2!(Q1%)π SX1%(Q1%) = SX2%(Q1%): SY1%(Q1%) = SY2%(Q1%)π NEXTπ R5! = R5! + StepAmount!: GOSUB CalcAroundπ FOR Q1% = 1 TO Divs%π Q2% = Q1% + 1π X1! = X1!(Q1%): Y1! = Y1!(Q1%): Z1! = Z1!(Q1%)π X2! = X1!(Q2%): Y2! = Y1!(Q2%): Z2! = Z1!(Q2%)π X3! = X2!(Q2%): Y3! = Y2!(Q2%): Z3! = Z2!(Q2%)π GOSUB CheckVisibilityπ IF VisibleSurface% THENπ X%(1) = SX1%(Q1%): Y%(1) = SY1%(Q1%)π X%(2) = SX1%(Q2%): Y%(2) = SY1%(Q2%)π X%(3) = SX2%(Q2%): Y%(3) = SY2%(Q2%)π X%(4) = SX2%(Q1%): Y%(4) = SY2%(Q1%)π CALL DrawPoly(X%(), Y%(), 4, Green)π END IFπ NEXTπNEXTππ'south polar areaπR5! = Pi!: X! = SIN(R5!) * R!: Y! = COS(R5!) * R!: Z! = 0πGOSUB PerspectiveCalculationsπX3! = X!: Y3! = Y!: Z3! = Z!πX%(3) = SX%: Y%(3) = SY%πFOR Q1% = 1 TO Divs%π Q2% = Q1% + 1π X1! = X2!(Q1%): Y1! = Y2!(Q1%): Z1! = Z2!(Q1%)π X2! = X2!(Q2%): Y2! = Y2!(Q2%): Z2! = Z2!(Q2%)π GOSUB CheckVisibilityπ IF VisibleSurface% THENπ X%(1) = SX2%(Q2%): Y%(1) = SY2%(Q2%)π X%(2) = SX2%(Q1%): Y%(2) = SY2%(Q1%)π CALL DrawPoly(X%(), Y%(), 3, Green)π END IFπNEXTπRETURNππCalcAround:πR4! = 0!: XX! = SIN(R5!) * R!: YY! = COS(R5!) * R!πFOR T% = 1 TO Divs%π X! = COS(R4!) * XX!: Y! = YY!: Z! = SIN(R4!) * XX!π GOSUB PerspectiveCalculationsπ X2!(T%) = X!: Y2!(T%) = Y!: Z2!(T%) = Z!π SX2%(T%) = SX%: SY2%(T%) = SY%π R4! = R4! + StepAmount!πNEXTπX1!(Xtra%) = X1!(1): X2!(Xtra%) = X2!(1)πY1!(Xtra%) = Y1!(1): Y2!(Xtra%) = Y2!(1)πZ1!(Xtra%) = Z1!(1): Z2!(Xtra%) = Z2!(1)πSX1%(Xtra%) = SX1%(1): SX2%(Xtra%) = SX2%(1)πSY1%(Xtra%) = SY1%(1): SY2%(Xtra%) = SY2%(1)πRETURNππSUB DrawPoly (X%(), Y%(), Vertices%, Culler%)πPSET (X%(Vertices%), Y%(Vertices%)), Culler%πFOR Q% = 1 TO Vertices%π LINE -(X%(Q%), Y%(Q%)), Culler%πNEXTπEND SUBππFUNCTION KeyPress%πKP$ = INKEY$πIF LEN(KP$) THEN π KP% = ASC(KP$): IF KP% = 0 THEN KP% = -ASC(MID$(KP$, 2))πEND IFπKeyPress% = KP%πEND FUNCTIONπAndrew L. Ayers COMPLETE BLAST! (MODE 13H) SUBSandrewa@indirect.com 10-04-96 (00:00) QB, QBasic, PDS 389 12999 BLASTLIB.BAS'****************************************************************************π'π' Description : Blast! Library - VGA Mode 13 Off-Screen Buffer Manipulationπ' routinesπ' Written by : Copyright (c) 1996 by Andrew L. Ayersπ' Date : 10/04/96π' Comments : Users of QBASIC will find that this program just barelyπ' fits into their environment. This is because QBASIC onlyπ' allows 160K of memory for code AND data. Since I createπ' two off-screen buffers of 64K each, this leaves only 32Kπ' for code and any other buffers. In most cases, you shouldπ' need only one off-screen buffer, giving you 96K for bothπ' code and any other buffers. There shouldn't be any problemsπ' with QuickBASIC, though, since it allows you to use 64K forπ' each procedure, and the rest of memory for your data. Noticeπ' the use of REDIM for the declaration of the buffers. This isπ' so I could resize the buffers to zero at the end of theπ' program. When I was coding this in QBASIC, I realized I need-π' ed to do this when HELP would no longer load due to lowπ' memory!π'π' If you want to view the source for the assembler routines,π' they are contained within the ".ASM" files included in thisπ' archive.π'π' I went to a lot of time and trouble to create this libraryπ' of routines. They are intended to fill a void that hasπ' existed for a while. I am distributing this library as free-π' ware, though I am retaining the copyright. You may use thisπ' library in any way you see fit. I only ask that you put myπ' name somewhere in your opening credits. Something likeπ' "Sprite Routines developed by Andrew L. Ayers" or "Developedπ' using the Blast! Library by Andrew L. Ayers". Other thanπ' that, it's free. Thank you, and have phun!π'π'****************************************************************************π'π' Declare our proceduresπ'πDECLARE SUB DrawLine (dsegment%, doffset%, x1%, y1%, x2%, y2%, colr%)πDECLARE SUB BlastGet (dsegment%, doffset%, ssegment%, soffset%, x1%, y1%, x2%, y2%)πDECLARE SUB BlastPut (dsegment%, doffset%, ssegment%, soffset%, xpos%, ypos%, icol%)πDECLARE SUB BlastPset (segment%, offset%, xpos%, ypos%, col%)πDECLARE SUB BlastCopy (fsegment%, foffset%, tsegment%, toffset%)π'π' Reserve assembler routine code memoryπ'πDIM SHARED code1%(14), code2%(21), code3%(76), code4%(76)π'π' BlastCopy! (BLSTCOPY.ASM)π'πcode$ = "1E5589E58B460E8ED88B760C8B460A8EC08B7E08B9007DF3A55D1FCA0800"π'πDEF SEG = VARSEG(code1%(0))π'πFOR i% = 0 TO 29π d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π POKE VARPTR(code1%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π' BlastPset! (BLSTPSET.ASM)π'πcode$ = "1E5589E58B46108ED88B760AB106D3E689F3B102D3E601DE8B5E0C01DE8B5E0E01DE8A460888045D1FCA0A00"π'πDEF SEG = VARSEG(code2%(0))π'πFOR i% = 0 TO 43π d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π POKE VARPTR(code2%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π' BlastPut! (BLASTPUT.ASM)π'πcode$ = "1E5589E58B460C508B460A508B46108ED88B760E8B04B103D3E8508B5EFE"πcode$ = code$ + "01C3895EFE8B4402508B5EFC01C3895EFC83C60489760E89E58B46188ED8"πcode$ = code$ + "8B76168A04468976163A461074208B5E1C8EDB8B7612B106D3E689F3B102"πcode$ = code$ + "D3E601DE8B5E1401DE8B5E1A01DE88048B4614408946148B460639461475"πcode$ = code$ + "BE8B46142B46028946148B4612408946128B460439461275A6585858585D"πcode$ = code$ + "1FCA0E00"π'πDEF SEG = VARSEG(code3%(0))π'πFOR i% = 0 TO 153π d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π POKE VARPTR(code3%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π' BlastGet! (BLASTGET.ASM)π'πcode$ = "1E5589E58B460A508B4608508B460A2B460E40508B46082B460C40508B46128ED8"πcode$ = code$ + "8B76108B46FABB0800F7E3890446468B46F88904464689761089E58B5E"πcode$ = code$ + "1E8EDB8B7614B106D3E689F3B102D3E601DE8B5E1601DE8B5E1C01DE8A"πcode$ = code$ + "048B5E1A8EDB8B76188804468976188B4616408946168B460639461676"πcode$ = code$ + "C38B46162B46028946168B4614408946148B460439461476AB58585858"πcode$ = code$ + "5D1FCA1000"π'πDEF SEG = VARSEG(code4%(0))π'πFOR i% = 0 TO 153π d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π POKE VARPTR(code4%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π'****************************************************************************π'π' Reserve memory for two off-screen buffers, sprites and demo variablesπ' Use REDIM so that we may de-allocate the memory at the end of the programπ'πREDIM buffer1%(31999) ' This is an off-screen bufferπREDIM buffer2%(31999) ' This is another...πREDIM sbuffer%(2000) ' This is our sprite bufferπ'πDIM bx%(40), by%(40), bt%(40), dx%(40), dy%(40)' Variables for demoπ'π'****************************************************************************π'π' Initialize Ballsπ'πFOR t = 0 TO 39π bx%(t) = INT(RND * 200) + 50: by%(t) = INT(RND * 100) + 50π bt%(t) = INT(RND * 2)π DOπ dx%(t) = INT(RND * 11) - 5: dy%(t) = INT(RND * 11) - 5π LOOP UNTIL dx%(t) <> 0 AND dy%(t) <> 0πNEXT tπ'πSCREEN 13π'π' Now, show some instructionsπ'πCOLOR 2πLOCATE 2, 2: PRINT "Blast! Library Demo by Andrew L. Ayers"π'πCOLOR 15πLOCATE 4, 1: PRINT "The following demo illustrates a simple"πLOCATE 5, 1: PRINT "use of the Blast! Library. Many 32 x 32"πLOCATE 6, 1: PRINT "and 16 x 16 sprites (up to 40) bounce on"πLOCATE 7, 1: PRINT "the screen in random directions. Use the"πLOCATE 8, 1: PRINT "+/- keys to add or subtract sprites from"πLOCATE 9, 1: PRINT "the screen. Notice how the sprites can"πLOCATE 10, 1: PRINT "overlap each other, without showing a"πLOCATE 11, 1: PRINT "black border. This masking effect is"πLOCATE 12, 1: PRINT "done by simply specifying black (0) as"πLOCATE 13, 1: PRINT "the invisible color. While in this demo"πLOCATE 14, 1: PRINT "I am using 32 x 32 and 16 x 16 sprites,"πLOCATE 15, 1: PRINT "any size sprite could be used. It all"πLOCATE 16, 1: PRINT "depends on the level of detail your"πLOCATE 17, 1: PRINT "sprites need as well as the number of"πLOCATE 18, 1: PRINT "sprites you place on screen at one time."π'π' Draw a simple graphic for the backgroundπ'πCOLOR 4πLOCATE 21, 3: PRINT "Please wait - Preparing Images.";π'πx1% = 159: y1% = 99: colr% = 0π'πFOR t% = 0 TO 319 STEP 4π CALL DrawLine(VARSEG(buffer2%(0)), VARPTR(buffer2%(0)), x1%, y1%, t%, 0, colr%)π colr% = colr% + 1: IF colr% > 255 THEN colr% = 0πNEXTπ'πPRINT ".";π'πFOR t% = 0 TO 199 STEP 4π CALL DrawLine(VARSEG(buffer2%(0)), VARPTR(buffer2%(0)), x1%, y1%, 319, t%, colr%)π colr% = colr% + 1: IF colr% > 255 THEN colr% = 0πNEXTπ'πPRINT ".";π'πFOR t% = 319 TO 0 STEP -4π CALL DrawLine(VARSEG(buffer2%(0)), VARPTR(buffer2%(0)), x1%, y1%, t%, 199, colr%)π colr% = colr% + 1: IF colr% > 255 THEN colr% = 0πNEXTπ'πPRINT ".";π'πFOR t% = 199 TO 0 STEP -4π CALL DrawLine(VARSEG(buffer2%(0)), VARPTR(buffer2%(0)), x1%, y1%, 0, t%, colr%)π colr% = colr% + 1: IF colr% > 255 THEN colr% = 0πNEXTπ'πCOLOR 2πLOCATE 21, 1: PRINT "Hit any key to begin demo - [ESC] exits"πCOLOR 15π'πDO: LOOP UNTIL INKEY$ <> ""π'πCLSπ'π' Create a 32 x 32 sprite for us to useπ'πo = 0πFOR t% = 14 TO 0 STEP -1π c% = 31 - t%π CIRCLE (15 + o, 15 + o), t%, c%π PAINT (15 + o, 15 + o), c%π o = o - .4πNEXT t%π'π' Get our spritesπ'πCALL BlastGet(&HA000, 0, VARSEG(sbuffer%(0)), VARPTR(sbuffer%(0)), 0, 0, 31, 31)π'πLINE (11, 11)-(18, 18), 0, BF ' Clear out centerπ'πCALL BlastGet(&HA000, 0, VARSEG(sbuffer%(0)), VARPTR(sbuffer%(514)), 7, 7, 22, 22)π'π' Initialize Demo Variablesπ'πnumballs% = 10: done% = 0π'πDOπ 'π ' Copy our background graphic to our off-screen buffer (which clears offπ ' old images of our sprites...) If you are using only a single buffer, justπ ' "get" the background behind each sprite before moving, move, then replaceπ ' the background, or just erase with the "ERASE arrayname" (see HELP)π ' command. I could done the "get, move, replace" on this demo, but I wantedπ ' to show how to use a background using the library...π 'π CALL BlastCopy(VARSEG(buffer2%(0)), VARPTR(buffer2%(0)), VARSEG(buffer1%(0)), VARPTR(buffer1%(0)))π 'π ' Put our spritesπ 'π FOR t% = 0 TO numballs% - 1π bx%(t%) = bx%(t%) + dx%(t%): by%(t%) = by%(t%) + dy%(t%)π IF bx%(t%) > 287 THEN dx%(t%) = -dx%(t%): bx%(t%) = 287π IF bx%(t%) < 0 THEN dx%(t%) = -dx%(t%): bx%(t%) = 0π IF by%(t%) > 167 THEN dy%(t%) = -dy%(t%): by%(t%) = 167π IF by%(t%) < 0 THEN dy%(t%) = -dy%(t%): by%(t%) = 0π CALL BlastPut(VARSEG(buffer1%(0)), VARPTR(buffer1%(0)), VARSEG(sbuffer%(0)), VARPTR(sbuffer%(bt%(t%) * 514)), bx%(t%), by%(t%), 0)π NEXTπ 'π ' Copy the off-screen buffer to the visible screenπ 'π CALL BlastCopy(VARSEG(buffer1%(0)), VARPTR(buffer1%(0)), &HA000, 0)π 'π ' Get user input for number of balls, or exitπ 'π a$ = INKEY$π SELECT CASE a$π CASE "-", "_"π numballs% = numballs% - 1π IF numballs% < 1 THEN numballs% = 1π CASE "+", "="π numballs% = numballs% + 1π IF numballs% > 40 THEN numballs% = 40π CASE CHR$(27)π done% = 1π END SELECTπ 'πLOOP UNTIL done%π'πCLSπ'π' Deallocate our large buffers, using REDIM to size to zeroπ'πREDIM buffer1%(0) ' This is an off-screen bufferπREDIM buffer2%(0) ' This is another...πREDIM sbuffer%(0) ' This is our sprite bufferππSUB BlastCopy (fsegment%, foffset%, tsegment%, toffset%)π 'π ' No error checking is done for this routine, so be careful whenπ ' you set the from and to segements and offsets - you could crashπ ' your machine...π 'π WAIT &H3DA, 8 ' Wait for vertical retraceπ 'π ' Copy!π 'π DEF SEG = VARSEG(code1%(0))π 'π CALL ABSOLUTE(BYVAL fsegment%, BYVAL foffset%, BYVAL tsegment%, BYVAL toffset%, VARPTR(code1%(0)))π 'π DEF SEGπ 'πEND SUBππSUB BlastGet (dsegment%, doffset%, ssegment%, soffset%, x1%, y1%, x2%, y2%)π 'π ' No error checking is done for X and Y coordinates, nor for any segmentsπ ' and offsets into memory. Therefore, use care when setting them so youπ ' don't crash your machine.π 'π DEF SEG = VARSEG(code4%(0))π 'π CALL ABSOLUTE(BYVAL dsegment%, BYVAL doffset%, BYVAL ssegment%, BYVAL soffset%, BYVAL x1%, BYVAL y1%, BYVAL x2%, BYVAL y2%, VARPTR(code4%(0)))π 'π DEF SEGπ 'πEND SUBππSUB BlastPset (segment%, offset%, xpos%, ypos%, col%)π 'π ' No error checking is done for X and Y coordinates, nor for any segmentsπ ' and offsets into memory. Therefore, use care when setting them so youπ ' don't crash your machine.π 'π ' Plot the pixel!π 'π DEF SEG = VARSEG(code2%(0))π 'π CALL ABSOLUTE(BYVAL segment%, BYVAL offset%, BYVAL xpos%, BYVAL ypos%, BYVAL col%, VARPTR(code2%(0)))π 'π DEF SEGπ 'πEND SUBππSUB BlastPut (dsegment%, doffset%, ssegment%, soffset%, xpos%, ypos%, icol%)π 'π ' No error checking is done for X and Y coordinates, nor for any segmentsπ ' and offsets into memory. Therefore, use care when setting them so youπ ' don't crash your machine.π 'π DEF SEG = VARSEG(code3%(0))π 'π CALL ABSOLUTE(BYVAL dsegment%, BYVAL doffset%, BYVAL ssegment%, BYVAL soffset%, BYVAL xpos%, BYVAL ypos%, BYVAL icol%, VARPTR(code3%(0)))π 'π DEF SEGπ 'πEND SUBππSUB DrawLine (dsegment%, doffset%, x1%, y1%, x2%, y2%, colr%)π 'π ' This is a simple routine which uses the traditionalπ ' Bresenham Algorithm to draw a line between two points.π ' It is pretty fast, but not fast enough for REAL workπ ' (like 3D and such) but you can use it if you want. Iπ ' plan on making an assembler version which should beπ ' MUCH faster.π 'π ' No error checking is performed for endpoints in this routine,π ' so be careful not to let the ends fall out of bounds, sinceπ ' doing so may cause your machine to crash...π 'π DEF SEG = dsegment%π 'π error.term% = 0π 'π xdiff% = x2% - x1%: ydiff% = y2% - y1%π xstep% = 1: ystep% = 320π 'π IF x1% >= x2% THEN xstep% = -1: xdiff% = -xdiff%π IF y1% >= y2% THEN ystep% = -320: ydiff% = -ydiff%π 'π xend% = ABS(xdiff%) - 1: yend% = ABS(ydiff%) - 1π 'π tt& = doffset% + (y1% * 320) + x1%π 'π IF xdiff% > ydiff% THENπ 'π FOR xx% = 0 TO xend%π POKE tt&, colr%π tt& = tt& + xstep%π error.term% = error.term% + ydiff%π IF error.term% >= xdiff% THENπ tt& = tt& + ystep%π error.term% = error.term% - xdiff%π END IFπ NEXTπ 'π ELSEπ 'π FOR yy% = 0 TO yend%π POKE tt&, colr%π tt& = tt& + ystep%π error.term% = error.term% + xdiff%π IF error.term% >= ydiff% THENπ tt& = tt& + xstep%π error.term% = error.term% - ydiff%π END IFπ NEXTπ 'π END IFπ 'π DEF SEGπ 'πEND SUBπAndrew L. Ayers BLAST! MODE 13H GET ROUTINE andrewa@indirect.com 10-04-96 (00:00) QB, QBasic, PDS 213 7929 BLASTGET.BASDIM code1%(76), code2%(76), sbuffer%(1000)π'π' BlastGet Routine (ASM Source tacked on at end)π'πcode$ = "1E5589E58B460A508B4608508B460A2B460E40508B46082B460C40508B46128ED8"πcode$ = code$ + "8B76108B46FABB0800F7E3890446468B46F88904464689761089E58B5E"πcode$ = code$ + "1E8EDB8B7614B106D3E689F3B102D3E601DE8B5E1601DE8B5E1C01DE8A"πcode$ = code$ + "048B5E1A8EDB8B76188804468976188B4616408946168B460639461676"πcode$ = code$ + "C38B46162B46028946168B4614408946148B460439461476AB58585858"πcode$ = code$ + "5D1FCA1000"π'πDEF SEG = VARSEG(code1%(0))π'πFOR i% = 0 TO 153π d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π POKE VARPTR(code1%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π' BlastPut Routineπ'πcode$ = "1E5589E58B460C508B460A508B46108ED88B760E8B04B103D3E8508B5EFE"πcode$ = code$ + "01C3895EFE8B4402508B5EFC01C3895EFC83C60489760E89E58B46188ED8"πcode$ = code$ + "8B76168A04468976163A461074208B5E1C8EDB8B7612B106D3E689F3B102"πcode$ = code$ + "D3E601DE8B5E1401DE8B5E1A01DE88048B4614408946148B460639461475"πcode$ = code$ + "BE8B46142B46028946148B4612408946128B460439461275A6585858585D"πcode$ = code$ + "1FCA0E00"π'πDEF SEG = VARSEG(code2%(0))π'πFOR i% = 0 TO 153π d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π POKE VARPTR(code2%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'πSCREEN 13π'πLINE (5, 5)-(10, 10), 15, BFπ'π' Get our spriteπ'πdbufferseg% = &HA000: dbufferptr% = 0π'πDEF SEG = VARSEG(code1%(0))π'πx1% = 0: y1% = 0: x2% = 15: y2% = 15πCALL ABSOLUTE(BYVAL dbufferseg%, BYVAL dbufferptr%, BYVAL VARSEG(sbuffer%(0)), BYVAL VARPTR(sbuffer%(0)), BYVAL x1%, BYVAL y1%, BYVAL x2%, BYVAL y2%, VARPTR(code1%(0)))π'πDEF SEGπ'πCLSπ'πdbufferseg% = &HA000: dbufferptr% = 0: icol% = 0π'πDEF SEG = VARSEG(code2%(0))π'πDOπ xpos% = INT(RND * 300)π ypos% = INT(RND * 170)π 'π CALL ABSOLUTE(BYVAL dbufferseg%, BYVAL dbufferptr%, BYVAL VARSEG(sbuffer%(0)), BYVAL VARPTR(sbuffer%(0)), BYVAL xpos%, BYVAL ypos%, BYVAL icol%, VARPTR(code2%(0)))πLOOP UNTIL INKEY$ <> ""π'πDEF SEGππ'******* END BLASTGET.BAS *********ππ-----------------------------------------------------------------------------ππ Name: BlastGet! - Offscreen Buffer to Sprite Buffer Memory Copyπ Date: October 11, 1996π Author: Andrew L. Ayersππ-----------------------------------------------------------------------------πBASIC Calling Procedure:π-----------------------------------------------------------------------------ππDIM code%(76) ' 77 Words Allocatedπ'π' Load hex codes for routine into memory hereπ'πDEF SEG = VARSEG(code%(0)) ' Get code segementπ'π' Call our routineπ'πCALL ABSOLUTE(BYVAL VARSEG(dbuffer%(0)), BYVAL VARPTR(dbuffer%(0)), --->π BYVAL VARSEG(sbuffer%(0)), BYVAL VARPTR(sbuffer%(0)), --->π BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%, VARPTR(code%(0)))ππDEF SEG ' Reset to default segmentππ-----------------------------------------------------------------------------πStack Descriptor:π-----------------------------------------------------------------------------ππThe following stack layout is only valid after all values are place onto theπstack for operation. In this routine, the layout is not valid until afterπbyte 0x003B is executed (label Get:), due to prior stack manipulation byπboth BASIC and the routine.ππSP Offset Descriptionsπ--------- ------------------------------------- π==[Pushed on by call to routine]=============π 1E Display Buffer Segmentπ 1C Display Buffer Offsetπ 1A Sprite Buffer Segmentπ 18 Sprite Buffer Offsetπ 16 X1 positionπ 14 Y1 positionπ 12 X2 positionπ 10 Y2 position π==[Pushed on by BASIC]=======================π 0E BASIC Return Segmentπ 0C BASIC Return Offsetπ==[Pushed on by routine]=====================π 0A DS Registerπ 08 BP Registerπ 06 X2 Positionπ 04 Y2 Positionπ 02 Widthπ 00 Heightππ------- ------- ------ --------------- -------------------------------------πHexCode Label OpCode Operands Remarksπ------- ------- ------ --------------- -------------------------------------π1E Start: PUSH DS ;Save the Destination Segmentπ55 PUSH BP ;Save the Base Pointerππ89E5 Init: MOV BP,SP ;Get the stack pointerπ8B460A MOV AX,[BP+0A] ;Get the X2 position and put it onπ50 PUSH AX ;the stack.ππ8B4608 MOV AX,[BP+08] ;Get the Y2 position and put it onπ50 PUSH AX ;the stack.ππ8B460A MOV AX,[BP+0A] ;Get the X2 position and subtractπ2B460E SUB AX,[BP+0E] ;the X1 position, increment it byπ40 INC AX ;1 and place it on the stack (thisπ50 PUSH AX ;is now the width).ππ8B4608 MOV AX,[BP+08] ;Get the Y2 position and subtractπ2B460C SUB AX,[BP+0C] ;the Y1 position, increment it byπ40 INC AX ;1 and place it on the stack (thisπ50 PUSH AX ;is now the height).ππ8B4612 MOV AX,[BP+12] ;Get the sprite buffer segement andπ8ED8 MOV DS,AX ;set the DS to it. Set the SI to theπ8B7610 MOV SI,[BP+10] ;sprite buffer offset.π8B46FA MOV AX,[BP-06] ;Get the width, and multiply by 8πBB0800 MOV BX,0008 ;(for compatability with BASIC's GETπF7E3 MUL BX ;routine) and put it into the spriteπ8904 MOV [SI],AX ;buffer. Add 2 the the SI toπ46 INC SI ;position it at the next data field.π46 INC SI π8B46F8 MOV AX,[BP-08] ;Get the height, and place it atπ8904 MOV [SI],AX ;this position, then add 2 to theπ46 INC SI ;SI to set it to the beginning ofπ46 INC SI ;actual sprite pixel data, andπ897610 MOV [BP+10],SI ;place it on the stack. Then resetπ89E5 MOV BP,SP ;the BP for later.ππ8B5E1E Get: MOV BX,[BP+1E] ;Otherwise, get the display bufferπ8EDB MOV DS,BX ;segment, and point DS to it.π8B7614 MOV SI,[BP+14] ;Then get the Y1 position.πB106 MOV CL,06 ;Multiply it by 64 by using a ShiftπD3E6 SHL SI,CL ;Left (SHL) for speed.π89F3 MOV BX,SI ;Save the result temporarily.πB102 MOV CL,02 ;Shift left again to multiply theπD3E6 SHL SI,CL ;Y1 position by 256, then add thatπ01DE ADD SI,BX ;value to our saved result.π8B5E16 MOV BX,[BP+16] ;Now get the X1 position and add itπ01DE ADD SI,BX ;to the result to get our finalπ8B5E1C MOV BX,[BP+1C] ;offset. Then get the display bufferπ01DE ADD SI,BX ;offset and add the pixel offset.π8A04 MOV AL,[SI] ;Get the pixel.ππ8B5E1A MOV BX,[BP+1A] ;Get the sprite buffer segment andπ8EDB MOV DS,BX ;point the DS (Dest. Segment) to it.π8B7618 MOV SI,[BP+18] ;Now get the sprite buffer offset.π8804 MOV [SI],AL ;Then put the color of the pixel.π46 INC SI ;Add 1 to our sprite buffer offsetπ897618 MOV [BP+18],SI ;and place it back on the stack.ππ8B4616 Done: MOV AX,[BP+16] ;Get the X1 position.π40 INC AX ;Increment the X1 position by 1π894616 MOV [BP+16],AX ;and put back on the stackπ8B4606 MOV AX,[BP+06] ;Check to see if the width has beenπ394616 CMP [BP+16],AX ;reached. If it hasn't, then get theπ76C3 JBE Get: [003C] ;next column, otherwise reset theπ8B4616 MOV AX,[BP+16] ;X1 position back to the left edgeπ2B4602 SUB AX,[BP+02] ;of the sprite by subtracting theπ894616 MOV [BP+16],AX ;width.π8B4614 MOV AX,[BP+14] ;Get the Y1 position, then incrementπ40 INC AX ;it by 1, and place it back on theπ894614 MOV [BP+14],AX ;stack. Then check to see if we haveπ8B4604 MOV AX,[BP+04] ;finished getting the sprite (Areπ394614 CMP [BP+14],AX ;we at the bottom?) If not, then do π76AB JBE Get: [003C] ;another line...ππ58 Exit: POP AX ;Pop the height off the stack.π58 POP AX ;Pop the width off the stack.π58 POP AX ;Pop the Y2 off the stack.π58 POP AX ;Pop the X2 off the stack.π5D POP BP ;Restore our registers for BASIC,π1F POP DS ;the exit the routine, cleaning upπCA1000 RETF 0010 ;the stack at the end...ππ-----------------------------------------------------------------------------πLength : 154 Bytes (77 Words)π-----------------------------------------------------------------------------πAndrew L. Ayers BLAST! MODE 13H PUT ROUTINE andrewa@indirect.com 10-04-96 (00:00) QB, QBasic, PDS 179 6943 BLASTPUT.BASDIM code1%(76), sbuffer%(1000)π'π' (ASM Source located at end of code)ππcode1$ = ""πcode1$ = code1$ + "1E5589E58B460C508B460A508B46108ED88B760E8B04B103D3E8508B5EFE"πcode1$ = code1$ + "01C3895EFE8B4402508B5EFC01C3895EFC83C60489760E89E58B46188ED8"πcode1$ = code1$ + "8B76168A04468976163A461074208B5E1C8EDB8B7612B106D3E689F3B102"πcode1$ = code1$ + "D3E601DE8B5E1401DE8B5E1A01DE88048B4614408946148B460639461475"πcode1$ = code1$ + "BE8B46142B46028946148B4612408946128B460439461275A6585858585D"πcode1$ = code1$ + "1FCA0E00"π'πDEF SEG = VARSEG(code1%(0))π'πFOR i% = 0 TO 153π d% = VAL("&h" + MID$(code1$, i% * 2 + 1, 2))π POKE VARPTR(code1%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'πSCREEN 13π'πLINE (5, 5)-(10, 10), 15, BFπGET (0, 0)-(15, 15), sbuffer%(0)π'πCLSπ'πdbufferseg% = &HA000: dbufferptr% = 0: icol% = 0: cnt% = 0π'πDEF SEG = VARSEG(code1%(0))π'πt = TIMERπDOπ xpos% = INT(RND * 300)π ypos% = INT(RND * 170)π 'π CALL ABSOLUTE(BYVAL dbufferseg%, BYVAL dbufferptr%, BYVAL VARSEG(sbuffer%(0)), BYVAL VARPTR(sbuffer%(0)), BYVAL xpos%, BYVAL ypos%, BYVAL icol%, VARPTR(code1%(0)))π cnt% = cnt% + 1πLOOP UNTIL cnt% = 1000πPRINT TIMER - tπDEF SEGππ'******** END BLASTPUT.BAS ********ππ-----------------------------------------------------------------------------ππ Name: BlastPut! - Sprite Buffer to Offscreen Buffer Memory Copyπ Date: September 30, 1996π Author: Andrew L. Ayersππ-----------------------------------------------------------------------------πBASIC Calling Procedure:π-----------------------------------------------------------------------------ππDIM code%(76) ' 77 Words Allocatedπ'π' Load hex codes for routine into memory hereπ'πDEF SEG = VARSEG(code%(0)) ' Get code segementπ'π' Call our routineπ'πCALL ABSOLUTE(BYVAL VARSEG(dbuffer%(0)), BYVAL VARPTR(dbuffer%(0)), --->π BYVAL VARSEG(sbuffer%(0)), BYVAL VARPTR(sbuffer%(0)), --->π BYVAL xpos%, BYVAL ypos%, BYVAL icol%, VARPTR(code%(0)))ππDEF SEG ' Reset to default segmentππ-----------------------------------------------------------------------------πStack Descriptor:π-----------------------------------------------------------------------------ππThe following stack layout is only valid after all values are place onto theπstack for operation. In this routine, the layout is not valid until afterπbyte 0x0036 is executed (label Plot:), due to prior stack manipulation byπboth BASIC and the routine.ππSP Offset Descriptionsπ--------- ------------------------------------- π==[Pushed on by call to routine]=============π 1C Display Buffer Segmentπ 1A Display Buffer Offsetπ 18 Sprite Buffer Segmentπ 16 Sprite Buffer Offsetπ 14 X positionπ 12 Y positionπ 10 Invisible Color π==[Pushed on by BASIC]=======================π 0E BASIC Return Segmentπ 0C BASIC Return Offsetπ==[Pushed on by routine]=====================π 0A DS Registerπ 08 BP Registerπ 06 Width + X Positionπ 04 Height + Y Positionπ 02 Widthπ 00 Heightππ------- ------- ------ --------------- -------------------------------------πHexCode Label OpCode Operands Remarksπ------- ------- ------ --------------- -------------------------------------π1E Start: PUSH DS ;Save the DS register for BASICπ55 PUSH BP ;Save the BP register for BASICππ89E5 Init: MOV BP,SP ;Get the stack pointerπ8B460C MOV AX,[BP+0C] ;Get the X positionπ50 PUSH AX ;Put the X position on the stackπ8B460A MOV AX,[BP+0A] ;Get the Y positionπ50 PUSH AX ;Put the Y position on the stackπ8B4610 MOV AX,[BP+10] ;Get the sprite buffer segmentπ8ED8 MOV DS,AX ;Point the DS (Dest. Segment) to itπ8B760E MOV SI,[BP+0E] ;Get the sprite buffer offsetπ8B04 MOV AX,[SI] ;Get the width, and divide by 8πB103 MOV CL,03 ;(using SHR for speed) to obtain theπD3E8 SHR AX,CL ;true width in pixelsπ50 PUSH AX ;Put the width on the stackπ8B5EFE MOV BX,[BP-02] ;Get the X positionπ01C3 ADD BX,AX ;Add width to the X positionπ895EFE MOV [BP-02],BX ;and put it back on the stackπ8B4402 MOV AX,[SI+02] ;Get the heightπ50 PUSH AX ;Put the height the stackπ8B5EFC MOV BX,[BP-04] ;Get the Y positionπ01C3 ADD BX,AX ;Add height to the Y positionπ895EFC MOV [BP-04],BX ;and put it back on the stackπ83C604 ADD SI,04 ;Reset the sprite buffer offsetπ89760E MOV [BP+0E],SI ;to the start of the pixel dataπ89E5 MOV BP,SP ;Retrieve stack pointerππ8B4618 Plot: MOV AX,[BP+18] ;Get the sprite buffer segment andπ8ED8 MOV DS,AX ;point the DS (Dest. Segment) to itπ8B7616 MOV SI,[BP+16] ;Now get the sprite buffer offsetπ8A04 MOV AL,[SI] ;Then get the color of the pixelπ46 INC SI ;Add 1 to our sprite buffer offsetπ897616 MOV [BP+16],SI ;and place it back on the stackπ3A4610 CMP AL,[BP+10] ;Is our pixel invisible?π7420 JZ Done: [006A] ;If it is, then don't plot it.π8B5E1C MOV BX,[BP+1C] ;Otherwise, get the display bufferπ8EDB MOV DS,BX ;segment, and point DS to itπ8B7612 MOV SI,[BP+12] ;Then get the Y positionπB106 MOV CL,06 ;Multiply it by 64 by using a ShiftπD3E6 SHL SI,CL ;Left (SHL) for speedπ89F3 MOV BX,SI ;Save the result temporarilyπB102 MOV CL,02 ;Shift left again to multiply theπD3E6 SHL SI,CL ;Y position by 256, then add thatπ01DE ADD SI,BX ;value to our saved resultπ8B5E14 MOV BX,[BP+14] ;Now get the X position and add itπ01DE ADD SI,BX ;to the result to get our finalπ8B5E1A MOV BX,[BP+1A] ;offset. Then get the display bufferπ01DE ADD SI,BX ;offset and add the pixel offset.π8804 MOV [SI],AL ;Plot the pixel.ππ8B4614 Done: MOV AX,[BP+14] ;Get the X positionπ40 INC AX ;Increment the X position by 1π894614 MOV [BP+14],AX ;and put back on the stackπ8B4606 MOV AX,[BP+06] ;Check to see if the width has beenπ394614 CMP [BP+14],AX ;reached. If it hasn't, then plot theπ75C7 JNZ Plot: [0037] ;next column, otherwise reset theπ8B4614 MOV AX,[BP+14] ;X position back to the left edgeπ2B4602 SUB AX,[BP+02] ;of the sprite by subtracting theπ894614 MOV [BP+14],AX ;width.π8B4612 MOV AX,[BP+12] ;Get the Y position, then incrementπ40 INC AX ;it by 1, and place it back on theπ894612 MOV [BP+12],AX ;stack. Then check to see if we haveπ8B4604 MOV AX,[BP+04] ;finished drawing the sprite (Areπ394612 CMP [BP+12],AX ;we at the bottom?) If not, then do π75AF JNZ Plot: [0037] ;another line...ππ58 Exit: POP AX ;Pop the height off the stackπ58 POP AX ;Pop the width off the stackπ58 POP AX ;Pop the height + y off the stackπ58 POP AX ;Pop the width + x off the stackπ5D POP BP ;Restore our registers for BASIC,π1F POP DS ;the exit the routine, cleaning upπCA0E00 RETF 000E ;the stack at the end...ππ-----------------------------------------------------------------------------πLength : 154 Bytes (77 Words)π-----------------------------------------------------------------------------πAndrew L. Ayers BLAST! MODE 13H PSET ROUTINE andrewa@indirect.com 10-04-96 (00:00) QB, QBasic, PDS 71 2331 BLSTPSET.BASDIM buffer%(31999), code1%(29), code2%(43)π'π' Assembler code (code1) is as follows:π'π' 1E PUSH DS ' Save the Data Segmentπ' 55 PUSH BP ' Save the Base Pointerπ' 89E5 MOV BP,SP ' Get the Stack Pointerπ' 8B460A MOV AX,[BP+0A] ' Let AX=Buffer Segment Addressπ' 8ED8 MOV DS,AX ' Set the Data Segment=AXπ' 8B7608 MOV SI,[BP+08] ' Let Source Index(SI)=Buffer Offsetπ' B800A0 MOV AX,A000 ' Set AX=Start of Video (13h)π' 8EC0 MOV ES,AX ' Set the Extra Segmentπ' BF0000 MOV DI,0000 ' Set the Destination Index to 0π' B9007D MOV CX,7D00 ' Number of words to copy (32000)π' F3A5 REP MOVSW ' Move the words!π' 5D POP BP ' Reset the Base Pointerπ' 1F POP DS ' Reset the Data Segmentπ' CA0400 RETF 0004 ' Return to BASIC Program, clean upπ' stack...π'π' Assembler code (code2) is as follows:π'πcode1$ = "1E5589E58B460A8ED88B7608B800A08EC0BF0000B9007DF3A55D1FCA0400"πcode2$ = "1E5589E58B46108ED88B760AB106D3E689F3B102D3E601DE8B5E0C01DE8B5E0E01DE8A460888045D1FCA0A00"π'π' Now we poke the code into the memory reserved for it:π'πDEF SEG = VARSEG(code1%(0))π'πFOR i% = 0 TO 29π d% = VAL("&h" + MID$(code1$, i% * 2 + 1, 2))π POKE VARPTR(code1%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'πDEF SEG = VARSEG(code2%(0))π'πFOR i% = 0 TO 43π d% = VAL("&h" + MID$(code2$, i% * 2 + 1, 2))π POKE VARPTR(code2%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'πSCREEN 13π'πDOπ 'π ' First, clear out our buffer (kinda like cls 0)π 'π ERASE buffer%π 'π ' Set some random pixels using our new routine...π 'π DEF SEG = VARSEG(code2%(0))π FOR t% = 1 TO 300π x% = INT(RND * 320)π y% = INT(RND * 200)π c% = INT(RND * 256)π CALL ABSOLUTE(BYVAL VARSEG(buffer%(0)), BYVAL VARPTR(buffer%(0)), BYVAL x%, BYVAL y%, BYVAL c%, VARPTR(code2%(0)))π NEXT t%π DEF SEGπ 'π ' Blast it to screen!π 'π DEF SEG = VARSEG(code1%(0))π CALL ABSOLUTE(BYVAL VARSEG(buffer%(0)), BYVAL VARPTR(buffer%(0)), VARPTR(code1%(0)))π DEF SEGπ 'πLOOP UNTIL INKEY$ <> ""πAndrew L. Ayers BLAST! MODE 13H SPRITE ROUTINE andrewa@indirect.com 10-04-96 (00:00) QB, QBasic, PDS 102 3222 BLSTSPRT.BASDIM sprite%(15, 15), buffer%(31999), code1%(29), code2%(43)π'π' Assembler code (code1) is as follows:π'π' 1E PUSH DS ' Save the Data Segmentπ' 55 PUSH BP ' Save the Base Pointerπ' 89E5 MOV BP,SP ' Get the Stack Pointerπ' 8B460A MOV AX,[BP+0A] ' Let AX=Buffer Segment Addressπ' 8ED8 MOV DS,AX ' Set the Data Segment=AXπ' 8B7608 MOV SI,[BP+08] ' Let Source Index(SI)=Buffer Offsetπ' B800A0 MOV AX,A000 ' Set AX=Start of Video (13h)π' 8EC0 MOV ES,AX ' Set the Extra Segmentπ' BF0000 MOV DI,0000 ' Set the Destination Index to 0π' B9007D MOV CX,7D00 ' Number of words to copy (32000)π' F3A5 REP MOVSW ' Move the words!π' 5D POP BP ' Reset the Base Pointerπ' 1F POP DS ' Reset the Data Segmentπ' CA0400 RETF 0004 ' Return to BASIC Program, clean upπ' stack...π'π' Assembler code (code2) is as follows:π'πcode1$ = "1E5589E58B460A8ED88B7608B800A08EC0BF0000B9007DF3A55D1FCA0400"πcode2$ = "1E5589E58B46108ED88B760AB106D3E689F3B102D3E601DE8B5E0C01DE8B5E0E01DE8A460888045D1FCA0A00"π'π' Now we poke the code into the memory reserved for it:π'πDEF SEG = VARSEG(code1%(0))π'πFOR i% = 0 TO 29π d% = VAL("&h" + MID$(code1$, i% * 2 + 1, 2))π POKE VARPTR(code1%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'πDEF SEG = VARSEG(code2%(0))π'πFOR i% = 0 TO 43π d% = VAL("&h" + MID$(code2$, i% * 2 + 1, 2))π POKE VARPTR(code2%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π'***************************************************************π'πDATA 0,0,0,0,0,F,F,F,F,F,F,0,0,0,0,0πDATA 0,0,0,F,F,4,4,4,4,4,4,F,F,0,0,0πDATA 0,0,F,4,4,4,4,4,4,4,4,4,4,F,0,0πDATA 0,F,4,4,4,4,4,4,4,4,4,4,4,4,F,0πDATA 0,F,4,4,4,3,3,3,3,3,3,4,4,4,F,0πDATA F,4,4,4,3,3,0,0,0,0,3,3,4,4,4,FπDATA F,4,4,4,3,0,0,0,0,0,0,3,4,4,4,FπDATA F,4,4,4,3,0,0,0,0,0,0,3,4,4,4,FπDATA F,4,4,4,3,0,0,0,0,0,0,3,4,4,4,FπDATA F,4,4,4,3,0,0,0,0,0,0,3,4,4,4,FπDATA F,4,4,4,3,3,0,0,0,0,3,3,4,4,4,FπDATA 0,F,4,4,4,3,3,3,3,3,3,4,4,4,F,0πDATA 0,F,4,4,4,4,4,4,4,4,4,4,4,4,F,0πDATA 0,0,F,4,4,4,4,4,4,4,4,4,4,F,0,0πDATA 0,0,0,F,F,4,4,4,4,4,4,F,F,0,0,0πDATA 0,0,0,0,0,F,F,F,F,F,F,0,0,0,0,0π'πFOR y% = 0 TO 15π FOR x% = 0 TO 15π READ valu$π sprite%(x%, y%) = VAL("&h" + valu$)π NEXT x%πNEXT y%π'πSCREEN 13π'πDOπ 'π ' First, clear out our buffer (kinda like cls 0)π 'π ERASE buffer%π 'π DEF SEG = VARSEG(code2%(0))π FOR t% = 1 TO 30π x% = INT(RND * 300)π y% = INT(RND * 180)π 'π FOR yy% = 0 TO 15π FOR xx% = 0 TO 15π c% = sprite%(xx%, yy%)π IF c% THENπ CALL ABSOLUTE(BYVAL VARSEG(buffer%(0)), BYVAL VARPTR(buffer%(0)), BYVAL xx% + x%, BYVAL yy% + y%, BYVAL c%, VARPTR(code2%(0)))π END IFπ NEXTπ NEXTπ NEXTπ DEF SEGπ 'π ' Blast it to screen!π 'π DEF SEG = VARSEG(code1%(0))π CALL ABSOLUTE(BYVAL VARSEG(buffer%(0)), BYVAL VARPTR(buffer%(0)), VARPTR(code1%(0)))π DEF SEGπ 'πLOOP UNTIL INKEY$ <> ""πAndrew L. Ayers GET/PUT MANIPULATION ROUTINES andrewa@indirect.com 10-22-96 (00:00) QB, QBasic, PDS 149 4990 GPMANIP.BAS 'π' Description : GET/PUT Manipulation Routinesπ' Written by : Andrew L. Ayersπ' Date : 10/22/96π'π' These routines show how you can *directly* manipulate the GET/PUT bufferπ' structure to build/destroy/read/write a sprite at any moment. You couldπ' display a sprite, modify the buffer, then display it again - changes andπ' all! These routines are powerful! For a great demonstration, see theπ' GetShift demo, which uses the same techniques to achieve a full (almost)π' screen scroll, with little overhead! For more info, read the commentsπ' within each routine...π'π' You may use this routine in any manner you like, as longπ' as you give credit in an appropriate manner. Have phun!π'πDECLARE SUB GetSpriteData (xsize%, ysize%, x%, y%, num%, colr%)πDECLARE SUB SetSpriteData (xsize%, ysize%, x%, y%, num%, colr%)π'πDIM SHARED buffer%(1000)π'πSCREEN 13π'π' Play with these lines...π'π'LINE (1, 1)-(14, 14), 12, BFπ'LINE (4, 4)-(11, 11), 4, BFπ'GET (0, 0)-(15, 15), buffer%(0)π'π'LINE (1, 1)-(14, 14), 15, BFπ'LINE (4, 4)-(11, 11), 3, BFπ'LINE (6, 6)-(9, 9), 235, BFπ'GET (0, 0)-(15, 15), buffer%(130)π'π'PUT (0, 0), buffer%(0), PSETπ'CALL GetSpriteData(16, 16, 6, 6, 1, colr%) ' Get a colorπ'PRINT colr%π'πCLSπ'π' Building a sprite from scratch!π'πCALL SetSpriteData(16, 16, -1, 0, 1, 128) ' Set the Width (16 x 8 = 128)πCALL SetSpriteData(16, 16, -3, 0, 1, 16) ' Set the Heightπ'πFOR y% = 0 TO 15π FOR x% = 0 TO 15π CALL SetSpriteData(16, 16, x%, y%, 1, 12) ' Dataπ NEXT x%πNEXT y%π'πFOR y% = 5 TO 10π FOR x% = 5 TO 10π CALL SetSpriteData(16, 16, x%, y%, 1, 4) ' Dataπ NEXT x%πNEXT y%π'π' Use the *real* PUT command to place our sprite!π'πPUT (50, 50), buffer%(130), PSETππSUB GetSpriteData (xsize%, ysize%, x%, y%, num%, colr%)π 'π ' xsize% = Width of sprite in pixelsπ ' ysize% = Height of sprite in linesπ ' x% = X position to "get", must be 0-(xsize%-1) (see note below)π ' y% = Y position to "get", must be 0-(ysize%-1) (see note below)π ' num% = Sprite number offset (0 if buffer only contains one image)π ' colr% = Color of pixel retrievedπ 'π ' **NOTE**π ' Both x% and y% must be set to values between 0 and "size" - 1. The onlyπ ' time this rule is not enforced is for the following:π 'π ' If x% is less than zero (0), and y% equals zero (0), then the followingπ ' information may be obtained for values of x% :π 'π ' Value Informationπ ' ----- -----------π ' -1 Low byte of width information (divide by 8 to get true width)π ' -2 High byte of width informationπ ' -3 Low byte of height information (true height)π ' -4 High byte of height informationπ 'π ' I believe for large sprites (larger than 32 x 256 pixels), both highπ ' and low bytes will have info in them for width and height, and there-π ' fore are true integer values (16 bit). In these cases, you will needπ ' to multiply the byte values out to get the 16 bit real value.π 'π DEF SEG = VARSEG(buffer%(0))π 'π spritewords% = ((xsize% * ysize%) / 2) + 2π 'π IF x% < 0 AND y% = 0 THENπ offset% = ABS(x%) - 1π ELSEπ offset% = ABS(y%) * ysize% + ABS(x%) + 4π END IFπ 'π colr% = PEEK(VARPTR(buffer%(num% * spritewords%)) + offset%)π 'π DEF SEGπ 'πEND SUBππSUB SetSpriteData (xsize%, ysize%, x%, y%, num%, colr%)π 'π ' xsize% = Width of sprite in pixelsπ ' ysize% = Height of sprite in linesπ ' x% = X position to "set", must be 0-(xsize%-1) (see note below)π ' y% = Y position to "set", must be 0-(ysize%-1) (see note below)π ' num% = Sprite number offset (0 if buffer only contains one image)π ' colr% = Color of pixel to setπ 'π ' **NOTE**π ' Both x% and y% must be set to values between 0 and "size" - 1. The onlyπ ' time this rule is not enforced is for the following:π 'π ' If x% is less than zero (0), and y% equals zero (0), then the followingπ ' information may be modified for values of x% :π 'π ' Value Informationπ ' ----- -----------π ' -1 Low byte of width information (multiply by 8 to set true width)π ' -2 High byte of width informationπ ' -3 Low byte of height information (true height)π ' -4 High byte of height informationπ 'π ' I believe for large sprites (larger than 32 x 256 pixels), both highπ ' and low bytes will need to have info in them for width and height, andπ ' therefore the width/height values will need to be broken down from theπ ' integer value (16 bit) to high and low byte values, then sent to thisπ ' routine.π 'π DEF SEG = VARSEG(buffer%(0))π 'π spritewords% = ((xsize% * ysize%) / 2) + 2π 'π IF x% < 0 AND y% = 0 THENπ offset% = ABS(x%) - 1π ELSEπ offset% = ABS(y%) * ysize% + ABS(x%) + 4π END IFπ 'π POKE (VARPTR(buffer%(num% * spritewords%)) + offset%), colr%π 'π DEF SEGπ 'πEND SUBπAndrew L. Ayers FAST SPRITE DEMO andrewa@indirect.com 10-22-96 (00:00) QB, QBasic, PDS 49 3139 FASTSPRT.BASDEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"FASTSPRT.ZIP",4^6:Z&=2071:?STRING$(50,177);πU"%up()%9%%%d-%+,8'FRd1Uu3*.%%01%%%1%%%%kf%xyxu%wySgIfx\%;:>SoO5vπU"-xNx0QQdo7VSdeC\gu&=<-/w9+qjOk#*GfY#2Q44EWlxvlR0.Bbp](?zB?gGE^kπU"6H[fqMGxgX(EQ]K<B[h+q:ri__A=j/,qp6IpN3hID$l^>n'b-;/_\vadk*Xc<-2πU"v/k0xGi\'/]r#OB9+XYl;JGt9\^fYT0nP)u#7e+4I9]E[Q#2G3Aj#hRaF6i4s1VπU"3ahIh08O4ql_xinr/Ba[iIiNFUJ8?iE<A?+A$'tE*H:Ec=2y=;UHa^3j5Rf2U/8πU"72Y98T$.*s)*3q]*p0#aP=T)e1<6p4VXWP;5\1:3mMv=HPg>nH4injq\/NGC^=QπU"2]A#+CZO1i#jAmE1V;cJTMiqd#iHJ9mu='vlvR70<kaU[-:Qp*GaQ)$0W3[Gs)rπU"&hpm)WMic%^I8K#I\EogEx2-)2SEb^6VFVChuq;R'Cs</?ge(?L^tE3Vqo[#q[/πU"h;cOAGPX_wmq=wHQdN>qV:#+YrTIh_<'*<+IG>*-3Pef+sAbr'GA5Gef31Aj*fQπU"RU2VWU&oo]MT&J#>>c.i.MEg.crI2Jx)f\(q-]tN[2=fwbBV2e<_=WQe-7X7lqiπU"=.[R)kQ0pj8r&uJ(m4.g_f:<\tTQcE;ZLwvPyj$4,roQooZ7wB-ic$C\tfA:gSVπU"Wf$M\^sDJqlcdjTU3NHepw)3jjL=*7\Go;Ik;HEPiRC5laP(U'0KSAw221t+F1hπU"N0ZUlhl>o..q/T'[yl-AXn_1(YD$oNDa&vL:7TX#C;4X(yB\&rMY3I1FupGCYS0πU"^93e6aQ#Tmb&cI3(ex+p&12AV0iTmPNsz4J]F$5Y*_e8?I[$XE(l&$zsW_p/hWwπU";/It63SvWS.Qr$[TVA%[#SU<,:;^GC'_6Gi>CRh:NP8NZ6NPkZO0/MHU8RHb5dQπU"X+.W9,2T?+/gztgd>s,n/Fa.e)Y';Ql$IJxC3Os%Gzk-4oKFI>\%P(KCX[q56DOπU"1[RgzV]qHu\rrJG#MWjh6)[GORb97Od86/7dwL7uwSRynCa^x[387SsjW2?p&\,πU"c]ll=G0=5ku#9'.UG]kk=-fG\yn<6XWh9HFuD#++3bZlL$+:B,ZF]5Q^+IGGxAyπU"/eMAdJ6J5CWJ<Cg*iS*lOJ-'oM4AP-gbZ?*,6IH5V=T^gql.+mt7wtF4aW4BmI=πU"J/rECiTB$pM%G6vKD;Vbtfe*$Dk98&(6$QY#'\>r%'BdBKo\YyZ(xbbjfu+XF-QπU"?8S,\1E72ri=>u'2gz5ZM2x)M(uR[DEof[CO1a0JC<'3\5MrhQpd>iAGEuwLj5NπU"Z(:vze>_/(zbU_NtL\=9yLlrUPt*RAW*mZ(sNE)k$If?OzhUO8NS(:Z0e.CYu_'πU"8Ob^^cZ;/-.Q6A7weDF)vk,?,Q<\gh(E]p%ZVox%xNfwXbN=udbz7\#z8^=%1=DπU"fWe+P#A9:<?Ev6:2un-Jh=p)m6XN:v.5GNi=ewdCL6BEMHuf+Yf))9tsG-LH1<9πU"/%6ceR-*>8v3wV&Ffxpb+;)HhSUh,L,Ds)DP_5Wb8nc;xvNv7YbNKh)NU'cRNbKπU"+.1RP]-slbQebu+G%vFX)&V7:h2G[jZ+?q&&0q6[HxDkfu(JZ7G2wT6Pe5Ay&]]πU"4Z$GV_$<<#G/uw3[-Z'C<]VHSL^h]?-MI]dRDuT&,[9o\5M9nRf6'?+Y3cdn)VcπU"wb):kz+*&_zkndj3?4(igYpO93Q,SWY&<o$x6>sZdL2x;-U^\i<y4TaxPS#4zH7πU"VK+0JHW8g6N'pTup%()9%%%%-%1lb%F7=wWp'T&%%-px%%%.%%%%xmnu%VSxu=wπU"fIv,9Te=a)YVARm&#hPBmcLNaPBP?K')g(QvumTU,L>jeSNoUfzvMkMt$5Qwsm5πU"9Da$Oulum-4Q4I]n;#lkuW#5nq4Hhl(amQHtNal7G^+2(ad8s$kflIMeaV[p1YeπU"8beG#uLWrCbfQZ/^Du3uomZ/8hh?Wg.3h^0?Xs$X_C*Yz^Ct^4surkK6jB0c[E9πU"nhHrHvIdj#$?a;d=U/9&O&(+#1=U/*9O&(%+1=U5/9O&%(+1=UU/9O%&(+1d=U/πU"9&O&(+#1=U/*9O&(%+1=U5/9O&%(+1=UU/9O%&(+1d=U/9&O&(+#1=U/*9O&(%+πU"1=U5/9O&%(+1=UU/9O%&(+1d=U/9&O&(+#1=U/*9O&(%+1=U5/9O&%(+1=UU/9OπU"%&(+1%=Y1?I+2RUOf<o00IU7=%Y1?+12RUfi<o0I(U7=Y%1?+2_RUf<;o0IU&7=πU"Y1#?+2RSUf<oG0IU7#=Y1i'xb1=UU/9O%&(+1d=U/9&O&(+#1=U/*9O&(%+1=U5πU"/9O&%(+1=UU/9OU&RtU%&(+1d=U/9&O&(+#1=U/*9O&(%+1=U5/9O&%(+1=UU/9πU"O%&(+1d=U/9&O&(+#1=U/<i>l#%up&'%9%9%%%%-%5+,'FBRdUu&3*%%&01%%%1πU"%%%%%%%%%&%E%%%%%%%%%kf%xyxu%wySg%fxup%&'9%%9%%%#-%lb&%F=w9WpT&πU"m%%px%%%.%%%%%%%%%%%%E%%%&]*%%%xmnu%VSxu%wup*%+%%%%%'%'(%#%%(%_πU",%%%%%πEND SUBπCLOSE:IF S=171AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπAndrew L. Ayers EXPLOSIONS EFFECT andrewa@indirect.com 10-22-96 (00:00) QB, QBasic, PDS 76 1630 EXPLOSNS.BAS'π' Description : Explosions - VGA mode 13 special effectπ' Written by : Andrew L. Ayersπ' Date : 10/22/96π'π' The name says it all!π'π' You may use this routine in any manner you like, as longπ' as you give credit in an appropriate manner. Have phun!π'πSCREEN 13π'π' Set up arrays for our explosion dataπ'πDIM x(50), y(50), xv(50), yv(50), ox(50), oy(50)π'πDOπ 'π ' Initialize an explosionπ 'π FOR t% = 0 TO 50π x(t%) = 0π y(t%) = 0π dir = RND * 6.28: vel = INT(RND * 5) + 1π xv(t%) = SIN(dir) * velπ yv(t%) = COS(dir) * velπ NEXT t%π 'π ' Initialize offsets and colorπ 'π tx% = INT(RND * 320)π ty% = INT(RND * 200)π c% = 31: done% = 0π 'π ' Print the titleπ 'π LOCATE 1, 6: PRINT "Explosions by Andrew L. Ayers"π LOCATE 23, 8: PRINT "Press any key to exit demo"π 'π ' Explode!π 'π DOπ 'π ' Move all the piecesπ 'π FOR t% = 0 TO 50π 'π ' Erase an old pieceπ 'π LINE (ox(t%) + tx%, oy(t%) + ty%)-(x(t%) + tx%, y(t%) + ty%), 0π ox(t%) = x(t%): oy(t%) = y(t%)π 'π ' Move the pieceπ 'π x(t%) = x(t%) + xv(t%)π y(t%) = y(t%) + yv(t%)π 'π ' Draw it at new positionπ 'π LINE -(x(t%) + tx%, y(t%) + ty%), c%π 'π NEXTπ 'π ' Decrement color to "fade"π 'π c% = c% - 1: IF c% < 16 THEN done% = 1 ' Do another explosion if doneπ 'π IF INKEY$ <> "" THEN done% = 2 ' Exit on any key pressπ 'π FOR dlay = 1 TO 5000: NEXT dlay ' Change to suit your machineπ 'π LOOP UNTIL done%π 'πLOOP UNTIL done% = 2π'πCLSπAndrew L. Ayers FAST & SMOOTH SCROLLING EFFECT andrewa@indirect.com 09-10-96 (00:00) QB, QBasic, PDS 89 2012 GETSHIFT.BAS'π' Description : GetShift - Mode 13 VGA Special Effect Routineπ' Written by : Andrew L. Ayersπ' Date : 09/10/96π'π' This shows off one hell of a way to achieve a very smooth and fast "scroll"π' type effect which may be useful in a game or demo. The technique I use toπ' do the effect is to shift the data within the GET buffer, re-displaying itπ' each time using the PSET operator. By keeping the buffer small, I can doπ' the shifting relatively fast, then copy the shifted version over and overπ' again on the screen to create a full screen scroll type effect!π'π' As always, if you use this in any of your creations, please consider yourπ' source and mention my name. Thanx, and have phun!π'πDIM a%(451), save%(24)π'πSCREEN 13π'π' Build our imageπ'πFOR t% = 15 TO 0 STEP -1π 'π col% = 31 - (t% * 2)π CIRCLE (15, 0), t%, col%π PAINT (15, 0), col%π 'π CIRCLE (15, 29), t%, col%π PAINT (15, 29), col%π 'π CIRCLE (0, 15), t%, col%π PAINT (0, 15), col%π 'π CIRCLE (29, 15), t%, col%π PAINT (29, 15), col%π 'πNEXTπ'π' Put it in the bufferπ'πGET (0, 0)-(29, 29), a%π'π' The following is info you might find helpfulπ'πdbyte% = a%(0)πhighbyte% = INT(dbyte% MOD 256)πlowbyte% = INT(dbyte% / 256)πwid% = INT(highbyte% / 8) ' Width of GET image in pixelsπ'πdbyte% = a%(1)πhighbyte% = INT(dbyte% MOD 256)πlowbyte% = INT(dbyte% / 256)πhgt% = highbyte% ' Height of GET image in linesπ'π' Clear off the screenπ'πCLSπ'πLOCATE 1, 3: PRINT "Smooth as Silk! - By Andrew L. Ayers"π'πDOπ 'π ' Shift the buffer upπ 'π FOR t% = 0 TO 14: save%(t%) = a%(2 + t%): NEXT ' Top lineπ 'π ' Middle linesπ 'π FOR t% = 17 TO 451π 'π a%(t% - 15) = a%(t%)π 'π NEXTπ 'π FOR t% = 0 TO 14: a%(437 + t%) = save%(t%): NEXT ' Bottom lineπ 'π ' Display it!π 'π FOR y% = 0 TO 5π 'π FOR x% = 0 TO 9π 'π PUT (7 + x% * 30, 10 + y% * 30), a%, PSETπ 'π NEXTπ 'π NEXTπ 'πLOOP UNTIL INKEY$ <> ""πAndrew L. Ayers QUADRATIC PLASMA andrewa@indirect.com 10-23-96 (00:00) QB, QBasic, PDS 148 3332 QPLASMA.BAS 'π' Description : Quadratic Plasmaπ' Written by : Andrew L. Ayersπ' Date : 10/23/96π'π' This is a program to create quadratic plasma (I am unsure onπ' the name here. I know I am not using quadratic equations, butπ' hey, call it what you want). The images are formed using onlyπ' math - no recursion, SIN/COS warping, or random numbers. Whatπ' comes out is a very nice display. On machines without a co-π' processor, this may take a little while. Have phun!π'πDECLARE SUB ReadRGB (red%, grn%, blu%, slot%)πDECLARE SUB WriteRGB (red%, grn%, blu%, slot%)πDECLARE SUB SetPal (start.slot%, end.slot%)π'πDIM oldr%(255), oldg%(255), oldb%(255)π'πSCREEN 13π'π' Save old paletteπ'πFOR t% = 0 TO 255π CALL ReadRGB(oldr%(t%), oldg%(t%), oldb%(t%), t%)πNEXT t%π'π' Create a custom 63 color paletteπ'πCALL WriteRGB(63, 63, 63, 1)πCALL WriteRGB(63, 0, 0, 15)πCALL WriteRGB(0, 63, 0, 31)πCALL WriteRGB(0, 0, 63, 47)πCALL WriteRGB(63, 63, 63, 63)π'πCALL SetPal(1, 15)πCALL SetPal(15, 31)πCALL SetPal(31, 47)πCALL SetPal(47, 63)π'π' Display quadratic plasmaπ'π' Try different numbers (greater than 1) for scale!π'π'scale = 1π'scale = 10πscale = 100π'scale = 250π'πFOR y = -100 * scale TO 100 * scale STEP 1 * scaleπ 'π h% = 0π 'π FOR x = -160 * scale TO 160 * scale STEP 1 * scaleπ 'π h% = h% + 1π 'π ' Try out these equations for different effects!π 'π c% = (SQR(x * x + y * y) AND 62) + 1π 'c% = ((SQR(x * x) + SQR(y * y)) AND 62) + 1π 'c% = (SQR(ABS(x * y) + ABS(x * y)) AND 62) + 1π 'c% = (SQR(ABS(x * x - y * y)) AND 62) + 1π PSET (h%, v%), c%π NEXTπ 'π GOSUB MovePalette ' Remove this line if your machine lacks a coprocessorπ v% = v% + 1π 'πNEXTπ'π' Move the palette for a cool effect!π'πDOπ GOSUB MovePaletteπ FOR delay = 1 TO 1000: NEXT delay' Adjust for your machineπLOOP UNTIL INKEY$ <> ""π'πCLSπ'π' Reset original RGB valuesπ'πFOR t% = 0 TO 255π CALL WriteRGB(oldr%(t%), oldg%(t%), oldb%(t%), t%)πNEXT t%π'πSTOPπ'πMovePalette:π 'π CALL ReadRGB(ored%, ogrn%, oblu%, 1)π 'π FOR t% = 1 TO 62π CALL ReadRGB(red%, grn%, blu%, t% + 1)π CALL WriteRGB(red%, grn%, blu%, t%)π NEXTπ 'π CALL WriteRGB(ored%, ogrn%, oblu%, 63)π 'πRETURNππSUB ReadRGB (red%, grn%, blu%, slot%)π 'π OUT &H3C7, slot% ' Read RGB values from slotπ 'π red% = INP(&H3C9)π grn% = INP(&H3C9)π blu% = INP(&H3C9)π 'πEND SUBππSUB SetPal (start.slot%, end.slot%)π 'π num.slots% = end.slot% - start.slot%π 'π CALL ReadRGB(sr%, sg%, sb%, start.slot%)π CALL ReadRGB(er%, eg%, eb%, end.slot%)π 'π rr% = ABS(er% - sr%): rg% = ABS(eg% - sg%): rb% = ABS(eb% - sb%)π rs% = SGN(er% - sr%): gs% = SGN(eg% - sg%): bs% = SGN(eb% - sb%)π 'π stepr = (rr% / num.slots%) * rs%π stepg = (rg% / num.slots%) * gs%π stepb = (rb% / num.slots%) * bs%π 'π r = sr%: g = sg%: b = sb%π wr% = r: wg% = g: wb% = bπ 'π FOR t% = start.slot% TO end.slot%π 'π CALL WriteRGB(wr%, wg%, wb%, t%)π 'π r = r + stepr: wr% = rπ g = g + stepg: wg% = gπ b = b + stepb: wb% = bπ 'π NEXT t%π 'πEND SUBππSUB WriteRGB (red%, grn%, blu%, slot%)π 'π OUT &H3C8, slot% ' Write RGB values to slotπ 'π OUT &H3C9, red%π OUT &H3C9, grn%π OUT &H3C9, blu%π 'πEND SUBπAndrew L. Ayers EXPLODING PIECES EFFECT andrewa@indirect.com 09-12-96 (00:00) QB, QBasic, PDS 146 3518 EXPLTRI.BAS 'π' Description : Exploding Pieces - Special Effect Routineπ' Written by : Andrew L. Ayersπ' Date : 09/12/96π'π' This shows off a pretty CPU intensive "explosion" of coloredπ' triangles, all spinning and moving away from a common center atπ' different velocitys. Perhaps it could be modified to be used inπ' a game or something. I wrote it after reading a post on one ofπ' the newsgroups about someone needing to create an explosion -π' I hope this helps some...π'π' As always, if you use this in any of your creations, please consider yourπ' source and mention my name. Thanx, and have phun!π'πSCREEN 7, , 1, 0π'πCONST MAX.NUM = 60π'π' Define a triangleπ'πTYPE triangleπ px1 AS INTEGERπ py1 AS INTEGERπ px2 AS INTEGERπ py2 AS INTEGERπ px3 AS INTEGERπ py3 AS INTEGERπ 'π nx1 AS INTEGERπ ny1 AS INTEGERπ nx2 AS INTEGERπ ny2 AS INTEGERπ nx3 AS INTEGERπ ny3 AS INTEGERπ 'π r AS INTEGERπ 'π x AS INTEGERπ y AS INTEGERπ 'π vx AS INTEGERπ vy AS INTEGERπEND TYPEπ'π' Set up a whole mess of 'emπ'πDIM pieces(MAX.NUM) AS triangleπ'π' Initialize themπ'πFOR t% = 0 TO MAX.NUMπ 'π pieces(t%).px1 = 0: pieces(t%).py1 = -5π pieces(t%).px2 = 5: pieces(t%).py2 = 5π pieces(t%).px3 = -5: pieces(t%).py3 = 5π 'π pieces(t%).nx1 = 0: pieces(t%).ny1 = -5π pieces(t%).nx2 = 5: pieces(t%).ny2 = 5π pieces(t%).nx3 = -5: pieces(t%).ny3 = 5π 'π pieces(t%).r = INT(RND * 360)π 'π pieces(t%).x = 160π pieces(t%).y = 100π 'π DOπ 'π pieces(t%).vx = (INT(RND * 17) - 8)π pieces(t%).vy = (INT(RND * 17) - 8)π 'π LOOP UNTIL pieces(t%).vx <> 0 AND pieces(t%).vy <> 0π 'πNEXTπ'π' Build SIN/COS tables for speedπ'πDIM sintable(359), costable(359)π'πrad = (3.14159 * 2) / 360π'πFOR t% = 0 TO 359π 'π sintable(t%) = SIN(t% * rad)π costable(t%) = COS(t% * rad)π 'πNEXT t%π'πr% = 0π'π' Explode!π'πDOπ 'π done% = 1π 'π ' ERASE LAST IMAGEπ 'π LINE (0, 0)-(319, 199), 0, BFπ 'π FOR t% = 0 TO MAX.NUMπ 'π IF pieces(t%).x >= 0 AND pieces(t%).x <= 319 AND pieces(t%).y >= 0 AND pieces(t%).y <= 199 THENπ 'π ' CALCULATE POSITION OF NEW IMAGEπ 'π lx1 = pieces(t%).px1 * sintable(r%) + pieces(t%).py1 * costable(r%)π ly1 = pieces(t%).px1 * costable(r%) - pieces(t%).py1 * sintable(r%)π lx2 = pieces(t%).px2 * sintable(r%) + pieces(t%).py2 * costable(r%)π ly2 = pieces(t%).px2 * costable(r%) - pieces(t%).py2 * sintable(r%)π lx3 = pieces(t%).px3 * sintable(r%) + pieces(t%).py3 * costable(r%)π ly3 = pieces(t%).px3 * costable(r%) - pieces(t%).py3 * sintable(r%)π 'π pieces(t%).nx1 = pieces(t%).x + lx1π pieces(t%).ny1 = pieces(t%).y + ly1π pieces(t%).nx2 = pieces(t%).x + lx2π pieces(t%).ny2 = pieces(t%).y + ly2π pieces(t%).nx3 = pieces(t%).x + lx3π pieces(t%).ny3 = pieces(t%).y + ly3π 'π ' DRAW NEW IMAGEπ 'π c% = INT(RND * 16)π 'π LINE (pieces(t%).nx1, pieces(t%).ny1)-(pieces(t%).nx2, pieces(t%).ny2), c%π LINE -(pieces(t%).nx3, pieces(t%).ny3), c%π LINE -(pieces(t%).nx1, pieces(t%).ny1), c%π 'π PAINT (pieces(t%).x, pieces(t%).y), c%π 'π pieces(t%).x = pieces(t%).x + pieces(t%).vxπ pieces(t%).y = pieces(t%).y + pieces(t%).vyπ 'π done% = 0π 'π END IFπ 'π NEXTπ 'π r% = r% + 15: IF r% > 359 THEN r% = 0π 'π ' SHOW IMAGE ON SCREENπ 'π PCOPY 1, 0π 'πLOOP UNTIL done%πAndrew L. Ayers OTHER NICE SPECIAL EFFECTS andrewa@indirect.com 10-24-96 (15:12) QB, QBasic, PDS 100 6558 EFFECTS.BAS DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"EFFECTS.ZIP",4^6:Z&=4644:?STRING$(50,177);πU"%up()%9%%%d-%b*.uF3H2=E,'7%%?)%%%1%%%%ns%yjwk%jwSg.fxDx;0>SUj5vπU"]=DNGhz./BQI\<>jTLIiu9CYey_58m2?b+)offAs%jNhFEaUfZCVuL>hVN4F6KiπU"S=l[bUbqjH5Yw/&Qu9q7bV>iK?-I$bUkljDq/'^.$54OV%Y61j[9C#Gc/?89:uxπU"Kb??hp)AGZGW=OBUD:;n0-D)Gjia\KN)oOgGfF[kv&4M[1TR[Ni,6Y,K/[gmw/JπU"JoJE]bVq[>*S%ekk&Ad'T4/.fOETFw*cxrBA6b%25;kKYzy6/\lu0*IcNS'?HmjπU"7,kpxHflfe/GnFME.#hm&dQ0S_g8i;8S.:9nEiTkh69aK8'w%rURt_K3F8aqB*:πU"TygOsH'Y3'1([uJU9S,o%KgxYylFrq0Zq3IVv9c^6couK.Y*;n,f=)p5[qH,kf(πU"/ZU?-sj'j6s14?dtYZGC>*zQc0jAB=.7<fg7RsS=RYM)]TK^b[6k7VWg7Y\sV=rπU"AQbZ[9qIU]h=nM\(a7Bj:gW8+*DDL#Rl:9m&;s/Og(Z1qZrOPn/I\lq3XO1#tg&πU":f9BKZ1fT9T.6-\$1<(sTdyi12?xO%p9K9bBPx<c]f-;=r[B5ze(ru(SKTkt3f.πU"fhvTwtvJs;]2d0I2\8WcG1+ofniuc5;6';Cf8_%ir%Qp*SQFe#WPJ$uN3qRRG(eπU"tb(%-D<s8UH<mMf$aNBjF-pdAt;^$>I[*cAMs3eCcx8;U4wnY8dTY/WBjHki;0fπU"mXGq_[>dI9bE207GYx;2FQ/>:K5R,ajF9mUVZ\JNu]a?Y%N-*-fOdu%p()9%%%%πU"-:%l*u%F&-N+B0+%+%k;%%%.%%%%qns(j)SgRfx6'2<Bjk=5wg>WxV&v3't)w.)πU"skmCxJka2XrxQo2'0Gdle6=C9R+_Y3kdJ;JF9B5W=8X]nIWeofbteZDf&K2EKC+πU"I\I#2;Nbsvd-hgrFFr',31Z%)o-0qlSE)_UH17BOcjmiU:9eJ[qt)1p-(Qtx17QπU"b&BV$/&sVR<%g,r[=7.(0x4'[6-lv:jw<^j:JG,:j:TfL)Y#m'[;21au>8Svuq:πU"RluV/LaPI'F''&K.*ShQg:L/t6)pLgZs:?q/6#7'f)9H&\EF)Eo:$TZ.6R_+UrnπU"=[?v0:6WGa30qt_jG*QKSRGulM1-Egfc==V1+V*V7(yB85qj92mN>.$g0&H'gkNπU"4Sg,):X.5(QmNk#thmewlEqNK0::eJl/,iWUk=J\Vh\/e+g4D2'7J-.5BhdPKzLπU"13G#m1dl/p(dbEo4tTy_L+hKVT7nKJO?<%aWS#S2[?BEZ)yfPxp_b>Ul-Y=m9QXπU"h2o\+'Y/<SkdlUn5LE20wp]'mr<P1;+52)n6+=:mZ13s&'^pY;SN:]I:,-vcKoWπU"8?$vPFiql9//as>PPgeZO1kqO\g8'j6/EFN?if-YEF_ibe1b088vqCp*zq-5t8JπU"l>pa,LRb$u(a9cYmaxX3u[T)8/GXuUTVdlS;6r\1.;8IC'&=R/XB#l%6$qP6g/FπU"utrMDuBzr.kX9r(?Jhc0ZA-.cO42+oS,nX.\w<&s+J*SX64((1Hoo$ne)SJUS7<πU"TsyCYE;;40r/'U<l<UiGpy_X'Mpnr6.d',&P$J(0<uFg7>WCv,&oPE^R_07JI]pπU"'CDgtg^#z<;f&e<<P)6+7?Z5;)hd-YxYu=3''<ddnqTVTNq;'&ppp:uKQCzGmX'πU"DZOq,si-x[:1^r02kTrR2hI#R:Zp_lKUG-_7Cj)or#7K:<B+Y/[^7<:hgEq7qAdπU")(K-Dv3)Q\BA_YJ4%,M?%%rF'sOk,(MPt-Gv>p?lk\bd_[b$jOa[Ux85ol-QYD=πU"bYIku1fY%kf9Pi/hhuLO9,-nCEx(c.JrqX=L6Ej59MfW\msUOctFHiJ5#:%0$KPπU"MM*u:p7%0mR^avtubhTr%;TKI0eY<5PJ-P%2;?QRfZkmut_kD7'_0$;t6YQglX1πU"f2uKdnCs-iD.&tVdy#>Xqhn%Ynp&ktja?I1.aNXG(rV&_%r*6g>;H>bybQE$OW#πU"4'6np)g<aUW9Z'GR0b7$6U('38Jz9-jmHqH$8#nYN?g#8A'OLn23?\TM'Gqju5,πU"Y_[#<fX-4idLZT4Lq'pOHV$vYWm)8I4.Y/Hc(0_G^\Vuiv:I:xN)42D(oKMITP-πU"\pz%'D1Gmpdi2M%[aJ.$Nrn$&#((ou^\t#MQJU$fi<KKE9(.2aSs5Q>7Vtm.]]fπU"Ne/Z06vc#Tu6qgl2=)Qj5$;pw=GB:&ah2'sCByJ,O%qA-bCZigioTym_A-YT+i7πU"]o^y,fNUPw+y3mA-YWasWnSZ2'so(2*cFpBZUng<757jx9q)25qQni*LY3l>-4FπU"qKTzC(>t78d6cmLF7F*_tbBBX0s[y.cmuz:y8YQfIzh)mwx%Btw)(1,pve\R_UwπU"N(b$1Wt6mK_N68'\KGmkV?2_8p:w8_:o'v?+Z2hBeaV86nhwc7r:bpuO&6Re(TLπU"WgpS*I0/-E?_AG0Cx\6t4oN=c+bsFwL4ze4O)OMOex7/(()nhA&02V:q2z-iUZ6πU"0&E5r)W(*V/:gC:4ZpzCJdhoI[0pbna\a(FStI2UU0<9*PcM=xr&=&tdwMx$#/MπU"nA+2SeeFnf=pG9V>(fbZ%sM0%AJ?gO3\*+yfn17Td'tD14,7MKrBT8Y%Vu^uqaQπU"qadNA56MZd,0Mr/CVHTG%k.t<5^Z.2v*+Q[[FOtpoDX;B6(+V^k9g-&(8w1_EMDπU"?j^X>w'Vk=3c0Hq=5=c1B03E<a%a]KVZsgZVJRDtM*4upuDfoS#O3lW2#IU?jVwπU"Z_2Wek*&[mbKnGgMNs(3b_ACM5sg$0B*<CPt7U%xo:1[kKnBsK?(H6Ac\9=HusAπU"'l/fBP^bGDXB(M#_g]xP_#aW)V7[+tY3j:rL42K?Pg?mTRKC;m4j<r4mQ%\s%YSπU"J&$4C6$3s/,1_LJqFRCx,F4s>WL7NH,=EGHmUR^<7Un3b*_=:mq?0kDZZLl0K?bπU"o'yhG:wo(^^=DCH\?,=lb5X*l7/6I80,(G(g2:6b)'Xv%,up(%)9%%[%-%6B*uFπU"$oc.w_#&%%[%)%%-%%%%x%unsS[gfx6kaV=Lde5Th+H^BsdHu)ZJs[txJ1fs_u1πU">;.Yr=u,c3G)(_?FHhkUM>H'%Buf[g67YL0JF5uGE0#lThEs;gbGP'*ZgnNq'<TπU"Jcy0OG*.KG1<GNX9^M^G.P6;[\c#QNBG-n%$vp7?5_=,2n%t^3/qbqF\uZz3_8nπU">;uZjZ2u$W^rGG=>j.q0pvZ.V)%;s4Xe1<9^q$Ou5k^XC$SFfGaRu6I]Y)=6Eq4πU"H),o,t7emIh:82gZ((;d9)lV*L?]a11j9s6e,)$R5#M9_VlK'\2)FfCewK+aF(MπU",qM?^/Ms[zA$WWZtY1l/h$_>s%P)\m352WL2S8,kx=WrYY92GtoBQ;$HTKe%5fDπU"EWRrN5pYFb>PGaHPlVgS,-_Yy%SG[x9J,S8?9JWg/]29*1\966<._uZXm3ZwNn-πU"8rXUGL2>Rt;^H[H^oa*W$>8=.(v%?qt?RMG_b=,alTPD+YS*\,\s.S5B*2CA7e9πU"?&pshT*3=6Rxo<PpE28pNOivM[oKt1m^Zis)jcY>:KX\e=^*<-b7u#:#mm\eWq%πU"-58$G+x\_Ikl$GhgTA*(oR*+WW#(glxxojAodeBQx*6^_=.=8[2cb:fD.IfCjljπU"zq=vTr%+up(%)9%%[%-%OB*uFpY40Ui%*%%z%2%%-%%%%k&(wjS#gfxlh%<BSmkπU"5wg4>xV2OxP_/h[[bQ&mIX=_2VN:k[:<kEjS;pskKJ4qbXsd-447'[qWrd8#9*TπU"oHcterWh\<;R21fm$XJK.j_TPc1F2;:.KK&kQPPXHh3U('[QwVQm$BkU^GIhnZwπU"]M7dq]A>uY$e,xVYU31Q00'3^?PHQCFcpd&I7XanSvqf>A<cGbG+J/<I4sfH$Y\πU"%?AGU;8m&JU;%Z57/Oic^)Ys7.F,]3H1??DAlfc(gw7)\<=N9=iL\.,26qU8DR;πU"kngl?3%2IuZK0u]Y2P\aQb%MkAOvQQPJ2Ay0(fPN_E]wM%;U:'8/bA=Nh0;qM$6πU"w'$0Seo.n\fuEns1ei##6>ORzP;+,9[g_M(loukcsO,UgCMw,=i(wB=%(y0?M.xπU"T6'KUeZ,IF&aQpI[WmeACT$RIT.]L86i5(>Lwq8qsv+M?/xyiEU,zF,PfsfTMwNπU"q9hXL[MO,F*i,.a]5esQEJ2a+Bh?SlMe,tm#JOo/V4-1dtt<#^L;\+P#F7yA$rnπU"WAFdFn#tc,bRwKNCsx*D3n-+%z1WH<s$^_YZ[YcCUH.5n7RL*&]$gZJ*U]?qH]JπU"]-p-MK85PDGon)<YUW%r%K?+YU[ITRqSqXch9_K<5Pga>UG$[ubT)?hqSn$c\,-πU"-./B%wrm1ubI2hOs'dLki6#I%c=wR.UdV%I#wng?'[Bd.h0cU/Ld]F7<*s0SfYQπU"AVWvk:\)>vA)jy15tF&&N[IE5D_3mCGO/zmc3'JP+o^iPPiD()<l3wO-F2dWL#oπU"3x:p$=j4vM[cjiMoqs>EKxpXcwq9UVBISVyMjmSys&NaLpm15eZQALFI=ls60peπU"p4b#):Ge:4aU,hiV/?MkSIsmQm\[mX[Ogw9*#G\j3wVqX.3*Y2p=lW''J6rd7Y7πU"&qRhGYIxVhrtI$5VgS[bW+h8d'o(xCO82V1xYw*+MN%5.:')yV_nV7Ld^3V:8bIπU"4.>Z(Pqpfdrv*fBQgOr6\r1k'x1R,YVQ42><m#T%nI?+Uc(hVI<(#XwpGZ[\k6xπU"cfv(1CHG4<PgWRFDHG%?KE4EK;0VP;'Pj#K-Lw=s4aoef=jQ$riwH0&BU%bEG]hπU",rG8vX8Up_(w\6]&/ga[=YIJz7+6:Yeh9XVGlp7%KS;J7\n&N/J5FZJ$IR;VcNVπU"m=j*_Nc4#_?Vsm+6*O$n.D%ICjJlo,A]I3UVKD2Gfq'aevWkeJ[F*ec3<q#rS/iπU"xkuxu,iolLXJ(+knNfH..pY0vhs,4,:gQ<6W.[y8asdTW+YjAC42'Ev/U2LfkFsπU"O#&TUI>#Q2(cdE>AW#R>U6MX%h+gE)zK+WfjT;h1v,gPjpI66X?^YjQ#vMVJJjlπU".NZ4j,M5'\uA&Mr8J(xb<^JQlOu:nhAD=YE]a)AsRCa_B3OunP.f8J>=]58D6<\πU"7_j=;/m>*xDTcig(MD9V,VI,dHJYdngxE(.dE)I>p4jv^3Y]eL:l:\m2F66R(J%πU"VO6Ak[?DG'69]SW+6]inJk;a;^=qCt+lvPHd)Qk25XgQ2R%M]>P&=O/'[zy_q=2πU"psCk<$o#K7*C<ZAZpAZwp8H=<)H3P8]Z^k_w\#*K%3%p'hl*sdN1<z.%L>81A=\πU"S:-+\OR1qN2V:m5WOZrK_4G9%s0Yb99p'*+].J4KU^.m\V7=cqtV7oV-D>eWR$^πU"2f_-]S\]*B4JKgP)'X?F$6W%wigX2LfO5GN1PlF3cWgz,Z[J%G%YPCrC^bOg/h>πU"GzpmA._Owqg;Y's;Yk-Z2wYMblFL=>l5qwEdR?owEDrx6#f;1BUItJt5jt&BfLZπU"/G2;QC:J5<[1Hqh+Hnb%dup&%'9%9%%%%-:%b*uCF3H=)E,'%+%?)%%%1%%%%%%πU"%%%&%E%%%%%%%%%n%syjw%kjwS%gfxu%p&'9%%9%%#%-%l'*uF&[-NB0[+%%k%;πU"%%.%%%%%%%%%&%%E%%(%V'%%%qns(j)Sg%fxup%&'9%%9%%%m-%6*duF$c=.w_&πU".%%[)%%%-%%%%%%%%%&%%E%%%&4.%%%xuns%Sgfx%up&'%9%9%%%%-%-O*uFqp4πU"0U&i*%%%z2%%%-%%%%%%%%%&%E%.%%#0#%%k(%wjSg%fxup%*+%%%%%)%7)%V%%πU"%%V6%%%%%πEND SUBπCLOSE:IF S=217AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπRobert Seidel MELTING SNOWMAN rseidel@ifk.uni-jena.de 10-25-96 (12:00) QB, QBasic, PDS 84 2438 SUMMER.BAS ' SUMMER.BAS - FREEWARE by Robert Seidel rseidel@ifk.uni-jena.deππ' █████████████████████████████████████████████████████π' █ █π' █ This file was found at Robert's HomePage ! █π' █ █π' █ Come and visit me if you are interested in: █π' █ █π' █ PowerBASIC, QBASIC, POVRAY, POVLAB, █π' █ FREE 3D Studio IPAS, PICTURES, █π' █ FREEWARE, GAME Levels █π' █ AND A LOT OF LINKS ! █ π' █ █π' █ http://www.uni-jena.de/~p6sepa/rshp.html ___ █π' █ (o o) █π' █ oOo ( O ) oOo █π' █████████████████████████████████████████████████████πππDEFINT A-ZπDIM melt(2400)ππSCREEN 13πRANDOMIZE TIMERππFOR i = 0 TO 63 'Paletteπ SetRGB i, 64 - i, 64 - i, 64 - i 'grauπ SetRGB i + 64, i, 0, 0 'rotπ SetRGB i + 128, 63, i, 0 'rot-orangeπNEXTππFOR i = 1 TO 50 'Schneeπ LINE (0, i + 150)-(320, i + 150), iπNEXTππRenderCircle 160, 158, 50, 1, .8 'SchneemannkörperπRenderCircle 160, 95, 35, 1, .8πRenderCircle 160, 50, 25, 1, .8πRenderCircle 149, 45, 3, 58, 1.2 'AugenπRenderCircle 169, 46, 3, 58, 1.2πFOR i = 85 TO 205 STEP 25 'Knöpfeπ RenderCircle 155 + RND * 2, i, 2, 50 + RND * 4, 1πNEXTπCIRCLE (160, 93), 40, 0, 1.2, 1.8 'MundπCIRCLE (160, 94), 40, 0, 1.2, 1.8πFOR i = 147 TO 177π LINE (i, 9)-(i - 2, 32), i - 130 'HutπNEXTπLINE (135, 32)-(184, 34), 30πFOR x = 16 TO 1 STEP -1 'Naseπ RenderCircle 142 + x, 59 - x / 2.5, x \ 4, 128 - x * 2, 1πNEXTππSLEEP 'Pauseππ'SCHMELZEFFEKT:πFOR i = 1 TO 4000 π x = RND * 271π y = RND * 150π GET (x, y)-(x + 48, y + 48), meltπ PUT (x, y + 1), melt, PSETπNEXT iππRenderCircle 160, 100, 60, 128, 1 'SonneπRenderCircle 140, 80, 7, 55, 1 'AugenπRenderCircle 180, 80, 7, 55, 1πCIRCLE (160, 80), 50, 60, 4, 5.5 'MundπCIRCLE (160, 88), 50, 60, 3.6, 5.8, 1.3ππSLEEP 'PauseππSUB RenderCircle (x, y, r, colstart, a!)π FOR i = r TO 0 STEP -1π CIRCLE (x, y), i, (colstart + i), , , a!π PAINT (x, y), (colstart + i)π NEXTπEND SUBππSUB SetRGB (Nr, r, g, b)π OUT &H3C8, Nrπ OUT &H3C9, rπ OUT &H3C9, gπ OUT &H3C9, bπEND SUBπMathew Robertson BOUNCING WOODEN BALL FidoNet QUIK_BAS Echo 10-21-96 (18:29) QB, QBasic, PDS 61 4350 BOUNCE.BAS 'Here is a little graphics program I wipped up. It is a simple bouncing ball.π'But the graphics are alot better then the plain old circle that most normalyπ'is used. I used a raytraced wooden ball instead. Just had to add a twist π'to it.ππDEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.3bπSUB V1:OPEN "O",1,"BOUNCE1.ZIP",4^6:Z&=2820:?STRING$(50,177);πU"%up()%9%'%d-%e)%rFI/+oFJ)7%%E-%%%0%%%%gt%zshj%VSgfCxdz,,B[[9hL6Ux/?Kj40LJπU"(1hj,aR)EU'n/gK_&YE3fjW)TfX0*aa1Z187&c+*hKkVfR#heCDHa^pCBYrjV3u3=Ykt>Y;$VπU":e>)bP>V/.qk;:&B?Nq+7F(SVj\>?[cCtZEo=VKb+IC>DDegVOACbkXLF?TE#1TZhhuxa7D3*πU"+qba^IU'h[&HF?O[TvXuY-Hq-geFAvP9#JsY;C*q*Fs8jnV.*qST7>45?Gb296\/;5YpqJU%LπU"O7n2l,8Fm^'BK+Uk5J.)ZiaV0D_CN)kpOrvS'R(SH6R&39i.VZ$+g5:F8n&sa^1N*]1iejbbaπU"_bl57&JjPLW1jFX6slFOBV'D+BS:-y/Q9(5lSkD(c898*;_yRUc:E-/sY3PPoFk2rPRTUeLqTπU"6<ZEb2vM6DEZ4>&ld<mUv[5<%V\OKc7GJNa+lmZ#Lj;^4,V_KkR?ee>#\TdZpCQ-^#]FUk^E4πU"FLW9hwIDd/o)EA'7mSY49$/n-'<M.m50_LkjcH9QsUUJ:0/qYF\;m\V2u(*UZldEo*o[H+D3BπU"pT=I+W+#76W2Vn<w825>(Wcu?H4]aC_,?/iwncfM&KXD6RrJpwTVOlQ3X&PMJ;1nCmqBylv/GπU".VoH_/SlOC6J=8zMB*E5gXX_BwueP]U9+D+BS3ivSw:nCi\JSlJ[X%ip6P&j]oM*lUXw+h;QyπU"]:4#*RZG(O7*VP'JMiL$jkpe>/hv?ff,k%6f+7([/#jjCnqE]+I1JI:Gu-^aSJg-vob;rZHLKπU"wc[MpxSq2aqC*ix^U;D74L;SsoW][mBWn6[SS8dW7?dzn2*ct8n\ROr0Nph8d*6t^umr%hM?_πU";xuS1A:20n*^Ct*=-]zmQjEP#?FpK^'_.*,wZpgC+\wgBM,NSb&GA]<MWOfA4(ng4mFtV6,pZπU"oV2e8Ap=g/vKmW8*nBE3C9*<KuM^;*:AJvSBBCBpwY,))eY;\#;%sE$k,*+il+V/wxNqnRXjZπU"S7I4kX-x;s]8Ke#1F)?QH:>;:hi<Gm()b(cw)_IXJ2vQOiN[ox_..U>UUJINs9(WVDEQ[WCBqπU"q1f-Z7Gp*;17kHF3of;D%z[,Z8X7^]5i&In2h(io:fq1Smt2,tfC/eNnt2D)6q&'o3Ji1pEdlπU"hA%zo_I(X&[VCZiKFrQjhk*_L=tmv^<7Od;ml)*gm$Bl#Ov=C##,[Lz>Vn2%p87%SX&_Kzqr.πU"KcJ,cI*%rI#*db.p*H*__f/k#H*zKAtEd%G_8v?:1?r33Y*LLjA#6hC%Y#riaj#B\GVYOW<YTπU"Bhmx_t>uVUC-$s-[p#^,RFX7tfJbl'6R3D_vOsp:z$qjJ>(dS?C4m/8[Q?L$('q<up%()9%%'πU"%-%)GdrF.ny$\'H'%%&M7%%%.%%%&&tti%VSufLq4d*-'TU1F*x0CL4-QHsi6O8*+);HTBBY-πU"gEkg=jIrgdu7OXXLdf,&WVbWxr?c'DK-l.2gB2m\OiH+mWPH8,Z$1W=lHdEEsb_rECUHI30#8πU"5&Kk47R]QnfSgG^tKE$hA3#dx3a>.kQOPN/)_c6N4k5=bmI\k+>C6fUa3CWnnbCA*C3R_2k+OπU"rp6zgqA;NLE8$EV_H$#ms_0?KtT(*TB3k=G\bJHt$$6]An$C3HXB,hn*JA7Ix\H=j2KQ-1jUBπU"^HhqB3WV#T3k=2Q%d$ckd$$],RbFkK*:zQe$qDaqo(,8,nmT>Gv<5khr<_%/E<dAOI*tAs,/HπU"T64JqjmZH\lDfgp_L2LsA+=L,hFIq_D2Ug,HNLokq'lbAJIt[snfomBdA5;bRqGH<Rd*TnElhπU"g;3>naE^lcVL_pjH(<^n\*zfoXX<2MVW.dfO3k;[TH;xR^9_/KXesxs'VE+G8_)[EM?=?=M?=πU"?=k?g?gk?g?gk?g?gk?g?gk?g?g>?/tK%WG6J7GLCi)Tw7ZaGS#fG\okJtr6JW;7>-\TS#f\WπU"oq67jTSZo5q67TWSZoqN67n7Mn7n7Mn7n7Mn7n7Mn7n7qn7h-bFS$fGlosJtv6LWY8h-FWS6SπU"6WS6S6WS6S6WS6S6WS6S69S<S<9S<S<9S<S<9S<S<9S<S<WS&S&WS&S&rS&S,5x?w?Vz9Eyr*πU"z?)4?D9qtz*&?T1?d9rEz*(-?9?0n:q%*?*?A?pP:E%u*,?I.?p:qZ&*.1Y:>OY0&:*Pi/%;&πU"rQ)*.q1:>OGY&:*OP/%;l&Q)*i.1:><OY&:S*P/%Y;&Q)Q*.1:l>OY&^:*P/q%;&QY)*.1Y:>πU"OY0&:*Pi/%;&rQ)*.q1:>OGY&:*OP/%;l&Q)*i.1:><OY&:S*P/%Y;&Q)>p.x%%up()%9%'%RπU"-%4d.rFYH:$vU'[%%,s%%%.%.%%&t%tiVS\%lfffSpz\[[%eZ+5'D'.8)Q-\Sf0B.0.3i8R[*πU".p[g:EuuBwGCgp\F]Lw=[a1V9G7<mo,U$IwH6svC_iv#IDa4u0v6wlMzY>fYV=Ebp0-v-VV3tπU"+u7tKeape-dts=56lF&sWRJMcYM>*mbw4PRl0)_vA#LN-\TMl#tD+*PEM^f$W<TK7q2(qQtX:πU"eMg8\G1mFcEbmwiPe&[*a5m$ME(eo(BdqS05)0<RUN<tCS*bv]Bm$0xMI:U+AAmNdP4TfA8*CπU"bDs&bnl\MgM&ceiZsMe8,uZTfwLT4docNbFs.DvsBk_DH3drm<XpSJNDmgCzfm>JRhhpmx.*XπU"^#Y,7-NVDWT-C%-CXTUr6MS(m;<&EUU'dBMgf<,[DJbo,k/A'Wv-ozBSso:V\Z2SgaeDTl0t>πU"L/Cp*CZbp3.0PnLZUSI$KXADqkX*'Hx^qgBv>]58okxW)\qBkD5l'lgC5kLihYsXDMOrT,sM%πU"IWRlt]lHfdWU$n3_Kh?9lP-qxsOo_9LS2NEB#pNE0k+l/mJVN(<3vB-W[)Wdkp#qiZHRt\JJhπU"kD8BTB-wo<$.#F?Pk,FpRi\s/YJs6-tN-.15Cc:2YK.G(1<BCVN17UeSM,sl2T_lYoHj)n,.<πU"m3ZglT9lO8VoQ(SuHQ7:),u..ode^UiHNX]MVTotduI6g-ck%cI.r<?.6ub.gQox$Oh2r<)FqπU"scCm3OgzziO7tQf8dIwTjvN\Ba_Nn;^ocdLd)EkOD6#M_(&rT\XsmR88N^js/GXWWbF'il/biπU"DJBMMEA;^dNulw:25ycy6&q6rxqBN\P0g4LyqDL[ws5p(a%ld%%%%%%%%%%%%%%%%%%%%%%%%πU"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[%%%wπU"-pw'u%p&'9%%9%'#%-%e')rFI7/oFJ[)%%E%-%%0%%%%%%%%%&%%E%%%%%%%%%gtz%shjV%SgπU"fx%up&'%9%9%%'%-%)GdrF.ny$\'H'%%&M7%%%.%%%%%%%%%&%E%%%%s).%%&t%tiVS%ufqu%πU"p&'9%%9%'[%-%4AdrFYdH$vU%'%%,'s%%.%%%%%%%%%&%%E%%%%i,%(%&tt#iVS%%lfup%*+%πU"%%%%(%.(%v%%%%l/%%%%%πEND SUBπCLOSE:IF S=90AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπKurt Kuzba VIEW CONTENTS OF RAM FidoNet QUIK_BAS Echo 02-21-96 (00:00) QB, QBasic, PDS 93 4299 QBMEMV.BAS '>> The segment before BIOS holds the interrupt vectors,π'> So 0000:0000 is the first byte in memory, then fromπ'> there, the pointers are placed for the ISR's, eachπ'> pointer requiring 4 bytes. That would put the end ofπ'> the last pointer at 0000:0400, which is 1k (or 1024π'> bytes) of memory used for storing pointers. Whatπ'> starts at 0000:0401 and what's after that?π'>.............π' The interrupt vectors actually extend from 0000:0000 toπ'0000:03ff, or 0030:00ff. This allows for 256 interrupts.π'You should recognize DEF SEG = &H40 as setting to the BIOSπ'area segment. Here you will find all the parameters forπ'your current system configuration, such as address for theπ'COM ports and PRN ports, your keyboard buffer, cursor x andπ'y position definitions, shift status register, color statusπ'register, screen mode register, BIOS clock, and so on.π'After that?? Have you ever seen my posting of QBMEMV.BAS?π'It will allow you to peek into these areas and see what isπ'going on in there. I believe the next portion is also setπ'aside for SYSTEM usage, at least in DOS.ππ'_|_|_| QBMEMV.BASπ'_|_|_| This program allows the user to view the contents ofπ'_|_|_| their system's RAM, up to 1 Megabyte.π'_|_|_| No guarantees or warrantees are given or implied.π'_|_|_| Released to PUBLIC DOMAIN by Kurt Kuzba. (2/21/96)πCOLOR 4, 0: CLS : f$ = CHR$(178): DIM BMem(256) AS STRING * 1πPRINT : PRINT " QUICKBASIC": PRINT : PRINT " MEMVIEW": COLOR 10πFOR t% = 1 TO 6: LOCATE t%, 16: PRINT STRING$(49, f$): NEXTπCOLOR 14, 5: LOCATE 2, 4, 0πLOCATE , 19: PRINT " Cursor UP +256 "πLOCATE , 19: PRINT " Cursor DOWN -256 "πLOCATE , 19: PRINT " Cursor RIGHT +4 K "πLOCATE , 19: PRINT " Cursor LEFT -4 K ": LOCATE 2πLOCATE , 42: PRINT " Page UP +64 K "πLOCATE , 42: PRINT " Page DOWN -64 K "πLOCATE , 42: PRINT " RETURN to EXIT "πLOCATE , 42: PRINT " ESCAPE to EXIT ": COLOR 10, 2πFOR t% = 7 TO 25: LOCATE t%, 2: PRINT STRING$(77, f$); : NEXTπLOCATE 8, 4: COLOR 1, 3: PRINT " ";πFOR t% = 0 TO 15: PRINT RIGHT$("0" + HEX$(t%), 2); " "; : NEXTπCOLOR 15, 1: CurSeg& = &H0πFOR t% = 0 TO 15: LOCATE 9 + t%, 10: PRINT SPACE$(49); : NEXTπDOππ FOR t% = 0 TO 15π COLOR 1, 3: LOCATE 9 + t%, 4ππ 'Was: PRINT(RIGHT$("0000" + HEX$(CurSeg&),4); HEX$(t%); ":";π 'Corrected by Richard Backus 9/18/96 to correct the linear addressingπ 'on left column.ππ PRINT LEFT$(RIGHT$("0000" + HEX$(CurSeg&), 4), 3); HEX$(t%); "0:";π DEF SEG = CurSeg&: COLOR 15, 1: PRINT " ";ππ FOR byte% = 0 TO 15π PRINT RIGHT$("0" + HEX$(PEEK(t% * 16 + byte%)) + " ", 3);π NEXTπ NEXT: COLOR 0, 7π FOR t% = 9 TO 24: LOCATE t%, 61: PRINT SPACE$(16); : NEXTπ COLOR 15, 1π DOπ DEF SEG = CurSeg&π FOR t% = 0 TO 15: FOR byte% = 0 TO 15π BMem(t% * 16 + byte%) = CHR$(PEEK(t% * 16 + byte%))π NEXT: NEXT: DEF SEG = &HB800π FOR t% = 0 TO 15: LOCATE t% + 9, 11: FOR byte% = 0 TO 15π PRINT RIGHT$("0" + HEX$(ASC(BMem(t% * 16 + byte%))) + " ", 3);π POKE 1400 + t% * 160 + byte% * 2, ASC(BMem(t% * 16 + byte%))π NEXT: NEXTπ Key$ = INKEY$: IF Key$ = "" THEN Key$ = " "π K% = ASC(Key$): IF K% = 0 THEN K% = -ASC(MID$(Key$, 2))π SELECT CASE K%π CASE -72: CurSeg& = CurSeg& - 16: Key$ = "LOOP"π IF CurSeg& < 0 THEN CurSeg& = 65535π CASE -80: CurSeg& = CurSeg& + 16: Key$ = "LOOP"π IF CurSeg& > 65535 THEN CurSeg& = 0π CASE -75: CurSeg& = CurSeg& - 256: Key$ = "LOOP"π IF CurSeg& < 0 THEN CurSeg& = 65535π CASE -77: CurSeg& = CurSeg& + 256: Key$ = "LOOP"π IF CurSeg& > 65535 THEN CurSeg& = 0π CASE -73: CurSeg& = CurSeg& - 4096: Key$ = "LOOP"π IF CurSeg& < 0 THEN CurSeg& = 65535π CASE -81: CurSeg& = CurSeg& + 4096: Key$ = "LOOP"π IF CurSeg& > 65535 THEN CurSeg& = 0π CASE 13, 27: out$ = "OUT": Key$ = "LOOP"π END SELECTπ LOOP WHILE Key$ <> "LOOP"πLOOP WHILE out$ <> "OUT"πCOLOR 14, 0: LOCATE 2, 67: PRINT "Thank You"πLOCATE 3, 67: PRINT "for using": LOCATE 4, 67: PRINT "QuickBasic"πLOCATE 5, 67: PRINT "MemView.": LOCATE 24, 1π'_|_|_| end QBMEMV.BASπCharles Godard PICK LIST DEMO FidoNet QUIK_BAS Echo 10-13-96 (12:20) QB, PDS 182 5336 PICKLIST.BAS' >Anyone out there have any code examples for a pick list box ? Mouse supportπ' >would be a welcome addtion :)π'π'Here is one I've been working on, off and on. It's not polishedπ'and I haven't started programming with the mouse yet, but maybeπ'you can polish it up and use it.π' Picklist.basπ' By Charles Godardπ' 10/12/96πDEFINT A-Zπ'$INCLUDE: 'qb.bi' 'give it a path to qb.biπDIM SHARED Inreg AS regtypex, outreg AS regtypexπ TYPE BoxTypeπ Char AS STRING * 1π Attr AS STRING * 1π END TYPEπ TYPE boxParametersπ scrn AS INTEGERπ Tr AS INTEGERπ Br AS INTEGERπ Lc AS INTEGERπ Rc AS INTEGERπ END TYPEπCOMMON SHARED Box() AS BoxType, bp AS boxParametersπ'***Duplicate the common shared and TYPE def when calling from another***π'***program module. Exact duplicates are advised! ...................***πSCREEN 0πCLSπCOLOR &H7, &H9: FOR i = 0 TO 999: PRINT CHR$(3); " "; : NEXTπDIM Item(8) AS STRING 'dim to only as many itemsπItem(0) = " Zero " 'as you will use in listπItem(1) = " One "πItem(2) = " Two ": Item(3) = " Three "πItem(4) = " Four ": Item(5) = " Five "πItem(6) = " Six ": Item(7) = " Seven "πItem(8) = " Eight "πSelected% = Picklist(10, 35, 8, 3, Item())πCOLOR &H1EπLOCATE 12, 31: PRINT "You selected Item: "; Selected%πCOLOR &HEπSLEEPππSUB ClosePicklistπ scrn = bp.scrnπ Tr = bp.Trπ Br = bp.Brπ Lc = bp.Lcπ Rc = bp.Rcπ FOR x = Tr TO Brπ FOR y = Lc TO Rcπ LOCATE x, y:π fg = ASC(Box(x, y).Attr) AND &HFπ bg = (ASC(Box(x, y).Attr) \ &H10)π COLOR fg, bgπ PRINT Box(x, y).Charπ NEXT y, xπscrn = scrn - 1πEND SUBππ'Waits for a sinlge keystroke and returns the function keys as aπ'minus numberπFUNCTION GetKey%π Inreg.ax = &H0π INTERRUPTX &H16, Inreg, outregπ LoVal% = outreg.ax AND &HFF 'returns Lo byte as ascii keys + #π 'hi-byte as - # (function keys)π IF LoVal% = 0 THENπ GetKey% = -(outreg.ax AND &HFF00) \ &H100π ELSEπ GetKey% = outreg.ax AND &HFFπ END IFπEND FUNCTIONππFUNCTION Picklist% (Tr%, Lc%, W%, H%, Item() AS STRING)πLines = UBOUND(Item)πIF H > Lines THEN H = LinesπBr = Tr + H: Rc = Lc + WπQBasicPU Tr, Br, Lc, Rc, &H34, "Choose"πoffset = 1:πScroll 0, Tr - 1, Br - 1, Lc - 1, Rc - 1, &H17, Br - Tr + 1π FOR Ct = 0 TO Hπ IF Ct < Br - Tr + 1 THEN 'scrolls upπ Scroll 0, Tr - 1, Br - 1, Lc - 1, Rc - 1, &H17, 1π LOCATE Br, Lcπ COLOR &H7, 4π PRINT Item(E%);π END IFπ E% = E% + 1π NEXTπ 'hi-lite the 1st lineπ Ct = 0 'reset it for reuseπ LOCATE Tr, Lc: COLOR &HF, 4π PRINT MID$(Item(Ct), offset, W%)π IF bxRow < Tr THEN bxRow = TrππDOπ KeyP% = GetKey%π SELECT CASE KeyP%π CASE IS = 13, 32π Selected% = Ctπ LOCATE 10, 1π 'PRINT Selected%π Picklist = Selected%π ClosePicklistπ EXIT FUNCTIONπ CASE IS = -80 'arrow Dn SCROLL THE COMMANDSπ Ct = Ct + 1 'keeps track of the elementπ IF Ct > Lines THEN ' limits # of variables to # ofπ Ct = Lines ' lines in file.π ELSEπ IF bxRow < Tr THEN bxRow = Tr 'sets top limit ofπ bxRow = bxRow + 1 'where scroll beginsπ 'scrolls PRINTING down the 1st pageπ IF bxRow < Br + 1 THENπ LOCATE bxRow, Lc: COLOR &HF, 4π PRINT MID$(Item(Ct), offset, W%)π LOCATE bxRow - 1, Lc: COLOR &H7, 4π PRINT MID$(Item(Ct - 1), offset, W%)π ELSEπ 'scrolls SCREEN UP prints to Bottom line on the 2nd pageπ 'colors the last lineπ LOCATE Br, Lc: COLOR 7, 4π PRINT MID$(Item(Ct - 1), offset, W%)π Scroll 0, Tr - 1, Br - 1, Lc - 1, Rc - 1, &H17, 1π LOCATE Br, Lc: COLOR &HF, 4π PRINT MID$(Item(Ct), offset, W% + 1)π IF bxRow > Br THEN bxRow = Brπ END IFπ END IFπ CASE IS = -72 'arrrow Up π 'scrolls SCREEN DN prints to the top line of 1st pageπ IF (bxRow <= Tr) AND Ct >= 1 THENπ bxRow = bxRow - 1: Ct = Ct - 1π LOCATE Tr, Lc: COLOR &H7, 4π PRINT MID$(Item(Ct + 1), offset, W%)π Scroll 1, Tr - 1, Br - 1, Lc - 1, Rc - 1, &H17, 1π LOCATE Tr, Lc: COLOR &HF, 4π PRINT MID$(Item(Ct), offset, W% + 1)π ELSEπ 'scrolls PRINTING UP the page when not on 1st lineπ IF Ct >= 1 THENπ bxRow = bxRow - 1: Ct = Ct - 1π LOCATE bxRow, Lc: COLOR &HF, 4π PRINT MID$(Item(Ct), offset, W%)π LOCATE bxRow + 1, Lc: COLOR &H7, 4π PRINT MID$(Item(Ct + 1), offset, W%)π END IFπ END IFπ END SELECTπLOOP UNTIL KeyP% = 27πClosePicklistπEND FUNCTIONππSUB QBasicPU (Tr%, Br%, Lc%, Rc%, Attr%, Title$)π bp.scrn = bp.scrn + 1π bp.Tr = Trπ bp.Br = Brπ bp.Lc = Lcπ bp.Rc = RcπREDIM Box(Br, Rc) AS BoxTypeπ FOR x = Tr TO Brπ FOR y = Lc TO Rcπ Box(x, y).Attr = CHR$(SCREEN(x, y, 1))π Box(x, y).Char = CHR$(SCREEN(x, y))π NEXT y, xπ bg = Attr AND &HF: fg = Attr \ &H10π COLOR fg, bgπ FOR x = Tr TO Brπ LOCATE x, Lc, 0π PRINT STRING$(Rc - Lc, CHR$(32))π NEXT xπEND SUBππSUB Scroll (dir%, upperRow, lowerRow, leftCol, rightCol, Attr%, Lines%)πIF dir% = 0 THEN dir% = &H6 ELSE dir% = &H7π'6 is up : 7 is downπ Inreg.ax = (dir% * &H100) + Lines%π Inreg.bx = Attr% * &H100π Inreg.cx = (upperRow * &H100) + leftColπ Inreg.dx = (lowerRow * &H100) + rightColπ INTERRUPTX &H10, Inreg, outreg 'no returnπEND SUBπNicolas Culberson MOUSE DRIVEN TRIANGLE exnihilo@rhunebbs.com 10-29-96 (00:06) QB, PDS 136 5551 TRIMOUS.BAS 'Ok... this program doesn't ACTUALLY do anything. It's the result of a lackπ'of INTERNET connection combined with boredom and visiting relatives youπ'don't want to know you are home.π'You need a mouse... a computer... some memory... a little hard-drive...π'patience... boredom... the default library... the real QUICKBASIC.π'Load up QuickBASIC by typing "QB/L" this loads the default library...π'You can use this however you like... I really don't care...π'If you make money off of it... pay me... I'm broke.π'If you at least bother to look at it...π'send me an e-mail...π'exnihilo@rhunebbs.com.π'Send me the latest ABC packet.π'Send me your funky code.π'Send me a life.π'All code by NICOLAS CULBERSON.π'This program intentionally bounces around like that! Oh yeah, and it wasπ'created on a 486/33 so if it doesn't work right on your computer don'tπ'tell me about it. I don't care.ππDECLARE SUB warp () 'Declare stuff...πDECLARE SUB right () 'Declare stuff...πDECLARE SUB down () 'Declare stuff...πDECLARE SUB up () 'Declare stuff...πDECLARE SUB left () 'Declare stuff...πDECLARE SUB shoot () 'Declare stuff...πREM $INCLUDE: 'QB.BI' 'Include the library thing...πDIM SHARED regx AS RegTypeX'Dim regx as regtypex and share it between theπ 'subs(see "Declare stuff...")πDIM SHARED a, b 'Do the same thing with the variables a,bπRANDOMIZE TIMER 'This Randomizes the computer timer(duh)ππCLS 'Clear the screen. If you don't understand thisπ 'statement... don't bother trying to figure theπ 'program out. You need a manual.πSCREEN 13 'Put the screen into 320 * 200 graphics mode.πa = regx.cx / 2 'Define the variable regx.cxπ '(the X AXIS on the mouse) as variable named a.π 'You must divide by half in screen 13.πb = regx.dx 'Do the same thing to the variable named b withπ 'the Y AXISπDO 'Begin LOOP(see LOOP)πa$ = INKEY$ 'Look for a keypress and place it in STRING A$πIF a$ = CHR$(27) THEN END 'If the key pressed is "esc" then escape.(pleaseπ '(note: this is high level programming, do notπ 'attempt to put such wonderful features in yourπ 'own programs without adult supervision.)πregx.ax = 2 'Hide the mouse cursorπCALL INTERRUPTX(&H33, regx, regx) 'Call the mouse interrupt at the addressπ '&H33... this works on most computers...πregx.ax = 3 'I dunno what this does but it has to beπ 'there last time I checked.πCALL INTERRUPTX(&H33, regx, regx) 'Call it again.πREM IF regx.dx > 139 THEN regx.dx = regx.dx - 1 'This line is remmed...π 'ignore it.πIF a > regx.cx / 2 THEN CALL left 'Call the sub LEFT if the mouseπ 'moves in the left direction.πIF a < regx.cx / 2 THEN CALL right 'Call the sub RIGHT if the mouseπ 'moves in the right direction.πIF b > regx.dx THEN CALL up 'Call the sub UP if the mouseπ 'moves in the UP direction.πIF b < regx.dx THEN CALL down 'Bear with me here... things do change.πIF regx.bx = 1 THEN CALL shoot 'Regx.bx is the mouse button variable.π '.bx=1 is button number 1π '.bx=2 is button number 2π '.bx=3 is button number 1 and 2 at theπ 'same time or button 3 if you have it, Iπ 'think.π 'So, this line checks for button 1...π 'and if it is pressed, calls the subπ 'named shoot.πIF regx.bx = 2 THEN CALL warp 'If button 2 is pressed...π 'call the WARP sub.πLOOP UNTIL bob = 1 'Loop forever. Whose BOB?πππ'Hmmm... you're still reading eh? Your internet connection must be down too.π'How about calling Zeitgeist BBS in Saint John... the phone number isπ'(506)832-9012 or something like that. Experiment... you never know who youπ'might get. When you get there... e-mail Ex Nihilo, or Beanpole, orπ'Ebenezer. ππSUB downπPSET (a, b), 0 'Delete the old oneπDRAW "e10f10l20" 'by drawing over top of it in black.πb = b + 1 'Move the picture down 1.πPSET (a, b), 12 'Redraw it.πDRAW "e10f10l20" ' " " .πPAINT (a + 3, b - 1), 14, 12 'Paint the yellow inside.πEND SUB 'End the Sub(pretty self explanatory)ππSUB leftπPSET (a, b), 0 'See SUB DOWN... it's the same thing.πDRAW "e10f10l20"πa = a - 1πPSET (a, b), 12πDRAW "e10f10l20"πPAINT (a + 3, b - 1), 14, 12πEND SUBππSUB rightπPSET (a, b), 0 'See SUB DOWN it's the same thing...πDRAW "e10f10l20"πa = a + 1πPSET (a, b), 12πDRAW "e10f10l20"πPAINT (a + 3, b - 1), 14, 12ππEND SUBππSUB shootπLINE (a + 10, b - 13)-(a + 10, b - 50), 10 'Draw the green shooting line.πFOR cool = 1 TO 100: NEXT cool 'Delay...πLINE (a + 10, b - 13)-(a + 10, b - 50), 0 'Draw over top of the shootingπ 'line in black.πEND SUBππSUB upπPSET (a, b), 0 'See SUB DOWN. Same dif...πDRAW "e10f10l20"πb = b - 1πPSET (a, b), 12πDRAW "e10f10l20"πPAINT (a + 3, b - 1), 14, 12πEND SUBππSUB warpπPAINT (a + 3, b - 1), 0, 12 'This SUB drops the ship somewhere else.πPSET (a, b), 0 'Figure it out each line by line for yourself...πDRAW "e10f10l20" 'I'm sick of explaining every little thing...πa = INT(RND * 300)πb = INT(RND * 180)πPSET (a, b), 12πDRAW "e10f10l20"πPAINT (a + 3, b - 1), 14, 12πFOR cool = 1 TO 1000: NEXT coolπEND SUBπMarek Piotrowski PARALLEL PORT TEST UTILITY ao487@freenet.toronto.on.ca 10-29-96 (19:33) QB, QBasic, PDS 335 11414 PRNPORT.BAS '╔════════════════════════════════════════════════════════════════════════════╗π'║ ║π'║ ║π'║ PRNPORT.BAS is a parallel port test utility. It allows single bit toggle ║π'║ and single bit monitoring of a selected parallel port. ║π'║ ║π'║ Author: Marek Piotrowski ao487@toronto.freenet.on.ca ║π'║ ║π'║ Credits: Christoph Kummetat for FindPort subroutine. ║π'║ ║π'╚════════════════════════════════════════════════════════════════════════════╝ππDIM SHARED Bit(2, 7) AS INTEGERπDIM SHARED OldByte(2) AS INTEGERπDIM SHARED Byte(2) AS INTEGERπDIM SHARED Port(4) AS INTEGERππDECLARE SUB ToggleBit (PortNum$)πDECLARE SUB DrawBottomBar ()πDECLARE SUB FindPort (PortNum$)πDECLARE SUB DrawScreen ()πDECLARE SUB PrintPortHeaders (PortNum$)πDECLARE SUB ReadPort (PortNum$)πDECLARE SUB BitPinToggle (Q$, BitPinSw%)πDECLARE SUB MoveCursor (Q$)ππππBitPinSw% = 1 'Bit or Pin number display switchπ '(1 = Bit numer display)πFOR Pt% = 0 TO 2πOldByte(Pt%) = NOT Byte(Pt%)πNEXT Pt%πππCLSππDATA " 9"," 8"," 7"," 6"," 5"," 4"," 3"," 2"πDATA "11","10","12","13","15"," "," "," "πDATA " "," "," "," ","17","16","14"," 1"ππFindPort PortNum$ 'Find ports availableπDrawBottomBarπDrawScreen 'Draw screen subroutineπBitPinToggle Q$, BitPinSw% 'Bit/Pin number display toggle subroutineπPrintPortHeaders PortNum$ 'PrintPortHeaders subroutineππππDOπQ$ = INKEY$ππReadPort PortNum$ 'read data from the ports subroutineπππππ IF Q$ = CHR$(9) THENπ BitPinToggle Q$, BitPinSw% 'Bit/Pin number display toggle subroutineπ END IFππ IF LEN(Q$) > 1 THENπ MoveCursor Q$ 'Cursor movement subroutineπ END IFππ IF Q$ = CHR$(32) THEN 'Detect space bar to toggle single bitπ 'at cursor position.πToggleBit PortNum$ 'Toggle one bitπππ END IFπππLOOP WHILE Q$ <> CHR$(27)πCOLOR 7, 0πCLSππSUB BitPinToggle (Q$, BitPinSw%)ππ OldCurRow% = CSRLINπ OldCurCol% = POS(0)πππ IF BitPinSw% > 0 THEN 'Toggle Pin to Bit numbersπ COLOR 7, 0π FOR Row% = 20 TO 21π LOCATE Row%, 3: PRINT STRING$(77, 32)π NEXT Row%πππ COLOR 12, 1π LOCATE 9, 4: PRINT "Bit"π FOR i = 55 TO 48 STEP -1π LOCATE 11 + (55 - i), 5π PRINT " "; CHR$(i)π NEXT iπ LOCATE 9, 29: PRINT "Bit"π FOR i = 55 TO 48 STEP -1π LOCATE 11 + (55 - i), 30π PRINT " "; CHR$(i)π NEXT iπ LOCATE 9, 53: PRINT "Bit"π FOR i = 55 TO 48 STEP -1π LOCATE 11 + (55 - i), 54π PRINT " "; CHR$(i)π NEXT iπ ELSEππππ COLOR 10, 1π LOCATE 9, 4: PRINT "Pin" 'Toggle Bit to Pin numbersπ FOR i = 55 TO 48 STEP -1π READ A$π LOCATE 11 + (55 - i), 5π PRINT A$π NEXT iπ LOCATE 9, 29: PRINT "Pin"π FOR i = 55 TO 48 STEP -1π READ A$π LOCATE 11 + (55 - i), 30π PRINT A$π NEXT iπ LOCATE 9, 53: PRINT "Pin"π FOR i = 55 TO 48 STEP -1π READ A$π LOCATE 11 + (55 - i), 54π PRINT A$π NEXT iππ COLOR 7, 0π LOCATE 20, 3: PRINT "Pin numbers apply to D-type 25 pin connector."π LOCATE 21, 3: PRINT "Pins 18 through 25 are logic ground."π RESTOREπ END IFππ COLOR 7, 0π LOCATE OldCurRow%, OldCurCol%, 1, 0, 4ππ BitPinSw% = -BitPinSw%πππEND SUBππSUB DrawBottomBarππLOCATE 23, 1πCOLOR 7, 0: PRINT " ";πCOLOR 0, 11: PRINT " Esc ";πCOLOR 15, 11: PRINT "- quit, ";πCOLOR 0, 11: PRINT "Tab ";πCOLOR 15, 11: PRINT "- Bit/Pin number toggle, ";πCOLOR 0, 11: PRINT "Space Bar ";πCOLOR 15, 11: PRINT "- toggle a bit ";ππCOLOR 7, 0ππEND SUBππSUB DrawScreenπLOCATE 1, 1πPRINT STRING$(80, 32)πPRINT " "; : COLOR 14, 1: PRINT " ╔══════════════════════════════════════════════════════════════════════════╗ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ PARALLEL PORT DIAGNOSTIC UTILITY - by Marek Piotrowski ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ╠══════════════════════════════════════════════════════════════════════════╣ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ PORT ADDRESS ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ╟────────────────────────╥───────────────────────╥─────────────────────────╢ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ ..... OUTPUT ║ ..... INPUT ║ ..... OUTPUT ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ╟───┬──────┬─────────────╫───┬──────┬────────────╫───┬──────┬──────────────╢ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ │Status│ Function ║ │Status│ Function ║ │Status│ Function ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ╟───┼──────┼─────────────╫───┼──────┼────────────╫───┼──────┼──────────────╢ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ │ .... │ data ║ │ .... │busy ║ │ .... │reserved ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ │ .... │ data ║ │ .... │acknowledge ║ │ .... │reserved ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ │ .... │ data ║ │ .... │out of paper║ │ .... │reserved ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ │ .... │ data ║ │ .... │prn.selected║ │ .... │enable IRQ ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ │ .... │ data ║ │ .... │error ║ │ .... │select prn. ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ │ .... │ data ║ │ .... │IRQ occured ║ │ .... │initialize prn║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ │ .... │ data ║ │ .... │reserved ║ │ .... │auto line feed║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║ │ .... │ data ║ │ .... │reserved ║ │ .... │strobe ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ╚═══╧══════╧═════════════╩═══╧══════╧════════════╩═══╧══════╧══════════════╝ "; : COLOR 7, 0: PRINT " "πLOCATE 22, 3: PRINT "Output pins 1, 14, 17 and input pin 11 operate in negative logic."πLOCATE 11, 8, 1, 0, 4ππEND SUBππSUB FindPort (PortNum$)ππ DEF SEG = 0π Count = 0π FOR i = 1032 TO 1036 STEP 2π PortAdd% = PEEK(i) + 256 * PEEK(i + 1)π IF PortAdd% > 0 THENπ Count = Count + 1π Port(Count) = VAL("&H" + HEX$(PortAdd%))π PRINT "Parallel port"; STR$(Count); " at ";π PRINT "&H" + HEX$(PortAdd%)π END IFπ NEXT iππ IF Count = 0 THEN 'no port foundπ PRINT "No parallel port found on your PC !";π ELSEπ PRINT "Which parallel port do you want to use : ";π DOπ PortNum$ = INKEY$π LOOP WHILE VAL(PortNum$) < 1 OR VAL(PortNum$) > Countππ END IFππEND SUBππSUB MoveCursor (Q$)ππ Q$ = RIGHT$(Q$, 1)π SELECT CASE ASC(Q$)π CASE 75 TO 77 'When left or right arrow key pressedπ IF POS(0) < 34 THEN 'toggle cursor column between 8 and 57.π LOCATE , 57, 1, 0, 4π ELSEπ LOCATE , 8, 1, 0, 4π END IFπ CASE IS = 72 'When up arrow key pressedπ IF CSRLIN > 11 THEN 'move cursor up or wrap fromπ LOCATE CSRLIN - 1, , 1, 0, 4 'row 11 to 18.π ELSEπ LOCATE 18, , 1, 0, 4π END IFπ CASE IS = 80 'When down arrow key pressedπ IF CSRLIN > 17 THEN 'move cursor down or wrap fromπ LOCATE 11, , 1, 0, 4 'row 18 to 11.π ELSEπ LOCATE CSRLIN + 1, , 1, 0, 4π END IFπππ END SELECTππEND SUBππSUB PrintPortHeaders (PortNum$)ππ OldCurRow% = CSRLINπ OldCurCol% = POS(0)π COLOR 14, 1π LOCATE 7, 10π PRINT "&H"; HEX$(Port(VAL(PortNum$)));π LOCATE 7, 35π PRINT "&H"; HEX$(Port(VAL(PortNum$)) + 1)π LOCATE 7, 59π PRINT "&H"; HEX$(Port(VAL(PortNum$)) + 2)π LOCATE OldCurRow%, OldCurCol%ππEND SUBππSUB ReadPort (PortNum$)πππ FOR Pt% = 0 TO 2 'Read data from the portππ OldCurRow% = CSRLIN 'Save old cursorπ OldCurCol% = POS(0) 'position before screen updateπππ Byte(Pt%) = INP(Port(VAL(PortNum$)) + Pt%)ππ IF Byte(Pt%) <> OldByte(Pt%) THEN 'If new byte differs fromπ 'old one write new bitsππ FOR Bt% = 0 TO 7π Bit(Pt%, Bt%) = (2 ^ Bt% AND Byte(Pt%)) \ (2 ^ Bt%)π NEXT Bt%ππππ SELECT CASE Pt%π CASE IS = 0π Clmn% = 9π CASE IS = 1π Clmn% = 34π CASE IS = 2π Clmn% = 58π END SELECTππ FOR Bt% = 7 TO 0 STEP -1π IF Bit(Pt%, Bt%) > 0 THENπ COLOR 15, 4π Tag$ = "High"π ELSEπ COLOR 0, 2π Tag$ = "Low "π END IFπππ LOCATE 18 - Bt%, Clmn%π PRINT Tag$π NEXT Bt%ππ COLOR 7, 0π LOCATE OldCurRow%, OldCurCol%, 1, 0, 4 'Restore cursor positionπππ END IFππ OldByte(Pt%) = Byte(Pt%)ππ NEXT Pt%πππEND SUBππSUB ToggleBit (PortNum$)πππ SELECT CASE POS(0) 'Determine which output you will write to.π CASE IS = 8π Pt% = 0π CASE IS = 57π Pt% = 2π END SELECTππ IF Bit(Pt%, 18 - CSRLIN) > 0 THEN 'Toggle sigle bit.π Bit(Pt%, 18 - CSRLIN) = 0π ELSEπ Bit(Pt%, 18 - CSRLIN) = 1π END IFπππ Byte(Pt%) = 0π FOR i = 0 TO 7π Byte(Pt%) = Byte(Pt%) + (Bit(Pt%, i) * 2 ^ i)π NEXT iππ OUT (Port(VAL(PortNum$)) + Pt%), Byte(Pt%)ππEND SUBπKurt Kuzba TERMINAL W/ANSI EMULATION FidoNet QUIK_BAS Echo 06-05-96 (00:00) QB, QBasic, PDS 201 7783 QUIKTERM.BAS'_|_|_| QUIKTERM.BASπ'_|_|_| This program will operate in ANSI emulation with ANSIπ'_|_|_| auto-detect. Must be compiled for high speeds.π'_|_|_| No warrantee or guarantee is given or implied.π'_|_|_| Released to PUBLIC DOMAIN by Kurt Kuzba. (6/5/96)πDECLARE SUB QuikCFG (d() AS STRING)πDECLARE SUB ansi (A$)πON ERROR GOTO BooBooπDIM FKEYS(13) AS STRING: port% = 0πFError$ = "ok": OPEN "quikterm.cfg" FOR INPUT AS #2πIF FError$ = "ok" THENπ FOR t% = 0 TO 13π IF EOF(2) THEN EXIT FORπ LINE INPUT #2, FKEYS(t%)π NEXT: port% = VAL(FKEYS(0))πEND IF: CLOSE 2πEx$ = CHR$(27) + "[": CrLf$ = CHR$(13) + CHR$(10)πCLS : altx$ = Ex$ + "0;1;32mALT/X to exit terminal" + CrLf$πIF port% = 0 THENπ LOCATE 1, 1, 1: PRINT "Choose a port (1/2)"π DO: port% = INSTR(" 12", INKEY$): LOOP WHILE port% < 2π port% = port% - 1: FError$ = "ok"π OPEN "quikterm.cfg" FOR OUTPUT AS #2π IF FError$ = "ok" THEN PRINT #2, MID$(STR$(port%), 2)πEND IF: CLOSE 2πFOR t% = 1 TO 34: ansi MID$(altx$, t%, 1): NEXTπport$ = "COM" + MID$(STR$(port%), 2) + ":19200,N,8,1"πFError$ = "ok": OPEN port$ FOR RANDOM AS #1 LEN = 8192πIF FError$ <> "ok" THEN PRINT "MODEM ERROR": ENDπDOπ Modemin$ = "": IF NOT EOF(1) THEN Modemin$ = INPUT$(1, #1)π ansi Modemin$π IF ANSIDetect$ <> "" THEN PRINT #1, ANSIDetect$: ANSIDetect$ = ""π kb$ = INKEY$π IF kb$ <> "" THENπ k% = ASC(kb$)π IF k% = 0 THENπ k% = ASC(MID$(kb$, 2))π SELECT CASE k%π CASE 45: CLOSE #1: ENDπ CASE 59 TO 68: k% = k% - 58π kb$ = FKEYS(k%)π DO: e% = INSTR(UCASE$(kb$), "^M")π IF e% > 0 THEN MID$(kb$, e%) = MID$(kb$, e% + 1)π IF e% > 0 THEN kb$ = LEFT$(kb$, LEN(kb$) - 1)π IF e% > 0 THEN MID$(kb$, e%, 1) = CHR$(13)π LOOP WHILE e% > 0π IF FKEYS(k%) = "" THEN k% = 0π CASE 133, 134: k% = k% = 122π kb$ = FKEYS(k%)π IF FKEYS(k%) = "" THEN k% = 0π CASE 37: QuikCFG FKEYS(): k% = 0π CASE ELSE: k% = 0π END SELECTπ END IF: IF k% > 0 THEN PRINT #1, kb$;π END IFπLOOP: CLOSE #1: ENDπBooBoo:π FError$ = STR$(ERR): RESUME NEXTπDEFINT A-ZπSUB ansi (A$)πDEFINT A-Z: DEF SEG = &HB800πSTATIC W, e, L, C, O, M, F, B, V, e$: SHARED ANSIDetect$πIF W < 99 THEN W = 100: C = 0: F = 7: B = 0: A = 0: M = F + 16 * BπIF A$ = "" THEN LOCATE C \ 80 + 1, C MOD 80 + 1, 1: EXIT SUBπIF e <> 27 THENπ IF ASC(A$) <> 27 THEN GOSUB CHRout: ELSE e = 27: e$ = A$π EXIT SUBπEND IFπIF O <> 27 AND ASC(A$) = 34 THEN O = e: EXIT SUBπIF O = 27 THENπ IF ASC(A$) = 34 THEN O = 0π EXIT SUBπEND IF: e$ = e$ + A$πIF LEN(e$) = 2 AND A$ <> "[" THEN e = 0: e$ = "": EXIT SUBπS = INSTR("HfABCDsuJKmhlpn", A$)πSELECT CASE Sπ CASE 0: EXIT SUBπ CASE 1: GOSUB CursorAπ CASE 2: GOSUB CursorAπ CASE 3: L = -1: GOSUB CursorLπ CASE 4: L = 1: GOSUB CursorLπ CASE 5: L = 1: GOSUB CursorCπ CASE 6: L = -1: GOSUB CursorCπ CASE 7: V = Cπ CASE 8: C = Vπ CASE 9: COLOR F, B: CLS : C = 0π CASE 10: FOR L = C TO C + 79 - (C MOD 80)π POKE L * 2, 32: POKE L * 2 + 1, M: NEXTπ CASE 11: GOSUB Colorzπ CASE 15: A$ = CHR$(27) + "[" + MID$(STR$(C \ 80 + 1), 2) + ";"π ANSIDetect$ = A$ + MID$(STR$((C MOD 80) + 1), 2) + "R"πEND SELECT: e = 0: e$ = "": EXIT SUBπCursorA: L = VAL(MID$(e$, INSTR(e$, "[") + 1))π C = VAL(MID$(e$, INSTR(e$, ";") + 1))π IF C > 0 THEN C = (C - 1): IF C > 79 THEN C = 79π IF L > 0 THEN L = (L - 1): IF L > 24 THEN L = 24π C = L * 80 + C: RETURNπCursorL: p = VAL(MID$(e$, INSTR(e$, "[") + 1))π p = p - (p < 1): L = INT(C \ 80) + p * Lπ IF L < 0 THEN L = 0: ELSE IF L > 24 THEN L = 24π C = (C MOD 80) + L * 80: RETURNπCursorC: p = VAL(MID$(e$, INSTR(e$, "[") + 1))π p = p - (p < 1): L = (C MOD 80) + p * L: C = INT(C \ 80) * 80π IF L < 1 THEN L = 0: ELSE IF L > 79 THEN L = 79π C = C + L: RETURNπColorz: e$ = MID$(e$, INSTR(e$, "[") + 1)π DO: e = VAL(e$)π SELECT CASE eπ CASE 0: F = 15: B = 0π CASE 1: F = F OR 8π CASE 5: B = B OR 8π CASE 8: F = Bπ CASE 30 TO 37: p = e - 29π e = ASC(MID$("@DBFAECG", p)) AND 7: F = (F AND 248) + eπ CASE 40 TO 47: p = e - 39π e = ASC(MID$("@DBFAECG", p)) AND 7: B = (B AND 248) + eπ END SELECT: p = INSTR(e$, ";"): e$ = MID$(e$, p + 1)π LOOP WHILE p > 0: M = F + 16 * B: RETURNπCHRout: p = ASC(A$)π IF p = 7 THEN FOR t% = 800 TO 1111 STEP 20: SOUND t%, .1: NEXT: RETURNπ IF p = 8 THENπ IF (C MOD 80) > 0 THENπ FOR t% = C * 2 TO (C \ 80) * 160 + 159π POKE t% - 2, PEEK(t%)π NEXT: C = C - 1π END IF: RETURNπ END IFπ IF p = 13 THEN C = C - (C MOD 80): RETURNπ IF p = 10 THEN C = C + 80π IF p <> 10 THEN POKE C * 2, p: POKE C * 2 + 1, M: C = C + 1π IF C >= 2000 THENπ C = C - 80: LOCATE 30, 80: PRINTπ DIM PK%(2): PK%(0) = 32: PK%(1) = Mπ FOR L = 3680 TO 3839π POKE L, PEEK(L + 160): POKE L + 160, PK%(L AND 1)π NEXTπ END IF: RETURNπEND SUBππSUB QuikCFG (d() AS STRING)π SHARED port%π DIM buf(4000) AS STRING * 1: DEF SEG = &HB800: F$ = SPACE$(80)π FOR t% = 0 TO 3999: buf(t%) = CHR$(PEEK(t%)): NEXTπ csr% = LEN(d(0)) + 1: macro% = 0: COLOR 10, 0: CLS : COLOR 14, 4π PRINT " COM "; : COLOR 10, 0: PRINT LEFT$(d(0) + F$, 75);π FOR t% = 1 TO 12π COLOR 14, 4: LOCATE t% + 1, 1: PRINT " F"; RIGHT$(STR$(t%), 2); " ";π COLOR 10, 0: PRINT LEFT$(d(t%) + F$, 75); : NEXTπ PRINT : PRINT : PRINT "RETURN exits: ALT/S saves"π DO: LOCATE macro% + 1, 6: COLOR 15, 1: PRINT LEFT$(d(macro%) + F$, 75);π LOCATE , csr% + 5: DO: k$ = INKEY$: LOOP WHILE k$ = ""π k% = ASC(k$): IF k% = 0 THEN k% = -ASC(MID$(k$, 2))π SELECT CASE k%π CASE 8π IF csr% > 1 THENπ csr% = csr% - 1π MID$(d(macro%), csr%) = MID$(d(macro%), csr% + 1)π d(macro%) = LEFT$(d(macro%), LEN(d(macro%)) - 1)π ELSE SOUND 999, .7π END IFπ CASE 13: FOR t% = 0 TO 3999: POKE t%, ASC(buf(t%)): NEXT: EXIT SUBπ CASE 32 TO 255π L$ = LEFT$(d(macro%), csr% - 1): r$ = MID$(d(macro%), csr%)π d(macro%) = LEFT$(L$ + k$ + r$, 70)π IF csr% < 75 THEN csr% = csr% + 1: ELSE SOUND 999, .7π CASE -31π FError$ = "ok": OPEN "quikterm.cfg" FOR OUTPUT AS #2π IF FError$ = "ok" THENπ FOR t% = 0 TO 13: PRINT #2, d(t%): NEXT: port% = VAL(d(0))π END IF: CLOSE 2π CASE -71: csr% = 1π CASE -72π IF macro% > 0 THENπ LOCATE macro% + 1, 6: COLOR 10, 0π PRINT LEFT$(d(macro%) + F$, 75);π macro% = macro% - 1: csr% = LEN(d(macro%)) + 1π ELSE SOUND 999, .7π END IFπ CASE -75π IF csr% > 1 THEN csr% = csr% - 1: ELSE SOUND 999, .7π CASE -77π IF csr% < 70 THEN csr% = csr% + 1: ELSE SOUND 999, .7π CASE -79: csr% = LEN(d(macro%)) + 1π CASE -80π IF macro% < 12 THENπ LOCATE macro% + 1, 6: COLOR 10, 0π PRINT LEFT$(d(macro%) + F$, 75);π macro% = macro% + 1: csr% = LEN(d(macro%)) + 1π ELSE SOUND 999, .7π END IFπ CASE -83π IF LEN(d(macro%)) >= csr% THENπ MID$(d(macro%), csr%) = MID$(d(macro%), csr% + 1)π d(macro%) = LEFT$(d(macro%), LEN(d(macro%)) - 1)π ELSE SOUND 999, .7π END IFπ END SELECTπ LOOPπEND SUBπ'_|_|_| end QUIKTERM.BASπBrian Mahocker PHREAK FONE ButtNuggie@aol.com 10-22-96 (18:45) QB, QBasic, PDS 48 3463 PFONE10.BAS 'Phreak Fone Ver. 1.0 By: Brian MahockerπStart:πCLSπLET Start% = 0πLOCATE 1, 1: COLOR 8: PRINT "P"; : COLOR 7: PRINT "H"; : COLOR 15: PRINT "R"; : COLOR 8: PRINT "e"; : COLOR 7: PRINT "a"; : COLOR 15: PRINT "K"; : COLOR 8: PRINT " "; : COLOR 7: PRINT "F"; : COLOR 15: PRINT "o"; : COLOR 8: PRINT "N"; : COLOR 7: PRINT "e"; : COLOR 15: PRINT " "; : COLOR 8: PRINT " "; : COLOR 7: PRINT "V"; : COLOR 15: PRINT "e"; : COLOR 8: PRINT "R"; : COLOR 7: PRINT "."; : COLOR 15: PRINT " "; : COLOR 8: PRINT "1"; : COLOR 7: PRINT "."; : COLOR 15: PRINT "0"; : COLOR 8: PRINT " "; : COLOR 7: PRINT "B"; : COLOR 15: PRINT "y"; : COLOR 8: PRINT ":"; : COLOR 7: PRINT " "; : COLOR 15: PRINT "B"; : COLOR 8: PRINT "R"; : COLOR 7: PRINT "i"; : COLOR 15: PRINT "a"; : COLOR 8: PRINT "n"; : COLOR 7: PRINT " "; : COLOR 15: COLOR 8: PRINT "M"; : COLOR 7: PRINT "a"; : COLOR 15: PRINT "H"; : COLOR 8: PRINT "o"; : COLOR 7: PRINT "C"; : COLOR 15: PRINT "K"; : COLOR 8: PRINT "e"; : COLOR 7: PRINT "R": COLOR 15: PRINTπINPUT "THe LoWeST NuMBeR To DiaL (No Dash) : ", LN&πINPUT "THe HiGHeST NuMBeR To DiaL (No Dash) : ", HN&πINPUT "PoRT NuMBeR (1/2) : ", port$πINPUT "RePeaT? (Y/N) :", R$: IF R$ = "Y" OR R$ = "y" THEN LET Repeat% = 1: IF R$ = "N" OR R$ = "n" THEN LET Repeat% = 0:πINPUT "aRe THeSe SeTTiNGS CoRReCT? (Y/N) : ", correct$: IF correct$ = "N" OR correct$ = "n" THEN GOTO StartπCLSπLOCATE 1, 1: COLOR 8: PRINT "P"; : COLOR 7: PRINT "H"; : COLOR 15: PRINT "R"; : COLOR 8: PRINT "e"; : COLOR 7: PRINT "a"; : COLOR 15: PRINT "K"; : COLOR 8: PRINT " "; : COLOR 7: PRINT "F"; : COLOR 15: PRINT "o"; : COLOR 8: PRINT "N"; : COLOR 7: PRINT "e"; : COLOR 15: PRINT " "; : COLOR 8: PRINT " "; : COLOR 7: PRINT "V"; : COLOR 15: PRINT "e"; : COLOR 8: PRINT "R"; : COLOR 7: PRINT "."; : COLOR 15: PRINT " "; : COLOR 8: PRINT "1"; : COLOR 7: PRINT "."; : COLOR 15: PRINT "0"; : COLOR 8: PRINT " "; : COLOR 7: PRINT "B"; : COLOR 15: PRINT "y"; : COLOR 8: PRINT ":"; : COLOR 7: PRINT " "; : COLOR 15: PRINT "B"; : COLOR 8: PRINT "R"; : COLOR 7: PRINT "i"; : COLOR 15: PRINT "a"; : COLOR 8: PRINT "n"; : COLOR 7: PRINT " "; : COLOR 15: COLOR 8: PRINT "M"; : COLOR 7: PRINT "a"; : COLOR 15: PRINT "H"; : COLOR 8: PRINT "o"; : COLOR 7: PRINT "C"; : COLOR 15: PRINT "K"; : COLOR 8: PRINT "e"; : COLOR 7: PRINT "R": COLOR 15: PRINTπLOCATE 3, 1: PRINT "CuRReNT FoNe NuMBeR :"πLOCATE 4, 1: PRINT "TiMe LeFT FoR CuRReNT FoNe NuMBeR :"πLOCATE 5, 1: PRINT "CuRReNT PoRT : "πCOLOR 8: LOCATE 5, 16: PRINT port$πStartDialing:πLET PN& = LN&πDOπCOLOR 8: LOCATE 3, 22: PRINT PN&: COLOR 15πOPEN "COM" + port$ + ":" + "9600,N,8,1,ASC" FOR OUTPUT AS #1πPRINT #1, "ATD" + ""; PN&; ""πLET time% = 15πDOπSOUND 32767, 9.1πSOUND 32767, 9.1πCOLOR 8: LOCATE 4, 36: PRINT time%πLET time% = time% - 1πLOOP UNTIL time% = -1πSOUND 32767, 10πPRINT #1, "+++"πSOUND 32767, 10πPRINT #1, "AT Z H0"πPRINT #1, "ATH"πSOUND 32767, 10πCLOSE #1πIF Repeat% = 1 AND PN& = HN& THEN GOTO StartDialingπIF Rapeat% = 0 AND PN& = HN& THEN GOTO End.πLET PN& = PN& + 1πLOOPπEnd.:πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"ππScott Turchin BACKSPACE LOCALLY & OVER MODEM nitehawk@tscnet.com 10-29-96 (11:13) PB 127 3288 BACKSPC.BAS SUB XPRINT(Fore%,Back%,StringofData$,LF%) PUBLICπ'------------No color--------------------πIF NOT Ansi% THEN 'Don't add colors in..π COLOR Fore%,Back%π PRINT StringofData$;π PRINT #1, StringofData$;π IF LF%=1 THENπ PRINTπ IF Carrier(Port%) THEN PRINT #1,CRLF$π END IFπ EXIT SUBπEND IFππ'-------------color part--------------------πESC1$=LTRIM$(CHR$(27)+"[") 'esc$ was used publicly in my program, I choseπesc1$ to eliminate problems.πGOSUB SETCOLORSππIF Carrier(Port%) THEN Print #1, ForeColor$+StringofData$;πIF Carrier(Port%) AND (Flash% OR Back%>0) THEN PRINT #1,CHR$(27)+"[0;30m";π'clears flashingππIF Flash% THEN INCR Fore%,16πCOLOR Fore%,Back%πIF INSTR(StringofData$,CHR$(8)) THEN EXIT SUB ELSE PRINT StringofData$; 'Doπnot print the backspace...ππIF LF%=1 THENπ COLOR 7,0π PRINTπ IF Carrier(Port%) THEN PRINT #1,CRLF$πEND IFπCOLOR 7,0 'Reset it..just in caseπEXIT SUBππSETCOLORS:πIF Fore% <= 8 THEN ESC1$=ESC1$+"0;"πIF Fore%>8 AND Fore%<16 THEN ESC1$=ESC1$+"1;"πIF Fore%>16 THENπ Flash%=-1π ESC1$=ESC1$+"5;"π DECR Fore%,16πEND IFπ SELECT CASE Fore%π CASE 0π ForeColor$=ESC1$+"30m"π CASE 1π ForeColor$=ESC1$+"34m"π CASE 2π ForeColor$=ESC1$+"32m"π CASE 3π ForeColor$=ESC1$+"36m"π CASE 4π ForeColor$=ESC1$+"31m"π CASE 5π ForeColor$=ESC1$+"35m"π CASE 6π ForeColor$=ESC1$+"33m"π CASE 7π ForeColor$=ESC1$+"37m"π CASE 8π ForeColor$=ESC1$+"30m"π CASE 9π ForeColor$=ESC1$+"34m"π CASE 10π ForeColor$=ESC1$+"32m"π CASE 11π ForeColor$=ESC1$+"36m"π CASE 12π ForeColor$=ESC1$+"31m"π CASE 13π ForeColor$=ESC1$+"35m"π CASE 14π ForeColor$=ESC1$+"33m"π CASE 15π ForeColor$=ESC1$+"37m"π CASE ELSEπ Fore%=7π END SELECTπIF Back%>0 THEN ForeColor$=LEFT$(ForeColor$,6)π SELECT CASE Back%π CASE 0π 'IS ASSUMED BLACK ALREADYπ CASE 1π ForeColor$=ForeColor$+";44m"π CASE 2π ForeColor$=ForeColor$+";42m"π CASE 3π ForeColor$=ForeColor$+";46m"π CASE 4π ForeColor$=ForeColor$+";41m"π CASE 5π ForeColor$=ForeColor$+";45m"π CASE 6π ForeColor$=ForeColor$+";43m"π CASE 7π ForeColor$=ForeColor$+";47m"π CASE ELSEπ Back%=0π END SELECTπRETURNπEND SUBππSUB BACKSPACE(I$,Fore%,Back%) PUBLICπCOLOR Fore%,Back%πCHATX% = CSRLIN: CHATY% = POS( O )πIF CHATY%=1 THENπ PRINT " ";π LOCATE CHATX%,CHATY%,1πELSEπLOCATE CHATX%,CHATY%-1πPRINT " ";πLOCATE CHATX%,CHATY%-1πEND IFπXPRINT Fore%,Back%,CHR$(8)+" "+CHR$(27)+"[D",0 'backspace one line, move πforward one line remotely using ANSI escape sequence.πIF InChat% THEN 'This backspaces a chat.log file in my chat routine..π Y=LOF(3) 'chat.log is opened as #3...π IF Y>2 THENπ SEEK #3, Y-1π PRINT #3," ";π SEEK #3, Y-1π END IFπEND IFπIF LEN(I$) THEN I$=LEFT$(I$,LEN(I$)-1) ELSE I$=NULL$ 'subtract one πcharacter if it is a word otherwise eliminate it...πEND SUBπEgbert Zijlema MOUSE ROUTINES W/DOUBLE CLICK zylema@bnc.nl 09-03-96 (23:10) PB 400 11082 MOUS.BAS ' MOUS.BAS - mouse routines, new version with double clickπ' (revision of MOUSDEMO.BAS)π' Author : Egbert Zijlema (E.Zijlema@uni4nn.iaf.nl)π' (up)Date : September 3, 1996π' Language : Power Basic 3.2π' Copyright status: Public Domainππ' Again?π' Yes, again a mouse routine from this author for a couple of reasons.π' A few minor bug fixes, to begin with.ππ' The most important reason for this revision, however, is a newπ' key/mouse trap: ScrollMouse. It now contains 2 different mouseπ' performances: the classical one to support pull down menus andπ' another one to doubleclick an item.ππ' In this revision I left a lot of things out, just to keep it asπ' simple as possible. For instance: the menu does not supportπ' highlighted characters and contains only 2 working options.π' Furthermore: I left the Power Basic mouse library out and replacedπ' it by plain BASIC INTERRUPT calls; only their names are identical.π' Registered PB-users may re-replace them by the faster assemblyπ' code that came with version 3.2 (subdirectory EXAMPLE\MOUSUNIT.BAS).π' In that case: DO NOT FORGET to implement the mouseflag tests in thoseπ' procedures. They are not in the original set. I suggested Dave Navarroπ' already to include them, in one way or another, within the followingπ' PB-release.ππ' ScrollMouse - method 1:π' When clicking in the menu bar the selected menu pops down. The normalπ' way here is to hold the left button until you confirm your selection byπ' releasing it.ππ' ScrollMouse - method 2:π' After you've selected "Select files" in the File menu you canπ' select 1 of the filenames by doubleclicking it. The doubleclick mustπ' be performed within half a second, otherwise the result will beπ' zero, in order to wait for a following doubleclick.π' You can always escape by pressing the Esc-key or the right mouse button.ππDEFINT A - Zππ%NO = 0 : %YES = NOT %NO ' true or falseπ%ALTF = 33 * 256 : %ALTX = 45 * 256π%HOME = 71 * 256 : %UP = 72 * 256π%DOWN = 80 * 256 : %ENDKEY = 79 * 256π%ENTER = 13 : %ESCAPE = 27π%MOUSEDRIVER = &H33 : %AX = 1 : %BX = 2 : %CX = 3 : %DX = 4ππTYPE MOUSEFLAGSπ mseon AS INTEGER ' cursor onπ mouse AS INTEGER ' mouse is thereπ menu AS BYTE ' matrix rowcounterπEND TYPEπDIM mflg AS SHARED MOUSEFLAGSππDIM MainScreen AS SHARED STRING ' original screenπDIM FileName(1 : 60) AS SHARED STRING ' array of 60 elementsπDIM matrix(1 : 50, 1 : 80) AS SHARED INTEGER ' 2 * 25 rows - 80 colsππ' NOTE: a text screen has 25 rows, indeed!π' BUT : the matrices of the menu(s) and the mainscreenπ' overlap. Therefore we reserve 'rows' 26 through 50π' for the menu, which is a much better way thanπ' swapping them after every menu/main screen switch.ππSUB MousInitπ temp = MsThere(buts)π COLOR 15, 0π LOCATE 25, 2π IF temp THENπ PRINT "Your mouse has ";LTRIM$(RTRIM$(STR$(buts))); " buttons";π mflg.mouse = %YESπ ELSEπ PRINT "Mouse driver not available";π END IFπEND SUBππFUNCTION MsThere(buts AS INTEGER) AS INTEGERπ REG %AX, 0π CALL INTERRUPT %MOUSEDRIVERπ buts = REG(%BX)π FUNCTION = REG(%AX)πEND FUNCTIONππSUB MsCursorOnπ IF mflg.mouse = 0 THEN EXIT SUB ' no mouse, so quitπ IF mflg.mseon = 0 THEN ' only when mouse is offπ REG %AX, 1π CALL INTERRUPT %MOUSEDRIVERπ mflg.mseon = %YES ' mouse cursor onπ END IFπEND SUBππSUB MsCursorOffπ IF mflg.mouse = 0 THEN EXIT SUBπ IF mflg.mseon THENπ REG %AX, 2π CALL INTERRUPT %MOUSEDRIVERπ mflg.mseon = 0 ' mouse cursor offπ END IFπEND SUBππSUB MsLocate(BYVAL row AS INTEGER, BYVAL col AS INTEGER)π IF mflg.mouse = 0 THEN EXIT SUBπ IF (pbvScrnMode = 7) OR (pbvScrnMode = 0) THENπ row = (row - 1) * 8π col = (col - 1) * 8π END IFπ REG %AX, 4π REG %CX, colπ REG %DX, rowπ CALL INTERRUPT %MOUSEDRIVERπEND SUBππSUB MsStatus(buttons AS INTEGER, row AS INTEGER, col AS INTEGER)π IF mflg.mouse = 0 THEN EXIT SUBπ REG %AX, 3π CALL INTERRUPT %MOUSEDRIVERπ buttons = REG(%BX)π row = REG(%DX)π col = REG(%CX)π IF (pbvScrnMode = 7) OR (pbvScrnMode = 0) THENπ row = (row \ 8) + 1π col = (col \ 8) + 1π END IFπEND SUBππSUB MsSetWindow(BYVAL row AS INTEGER, BYVAL col AS INTEGER, _π BYVAL rows AS INTEGER, BYVAL cols AS INTEGER)ππ IF mflg.mouse = 0 THEN EXIT SUBπ rows = row + rows - 1 ' adjust rows to real coordinatesπ cols = col + cols - 1 ' adjust cols to real coordinatesππ IF (pbvScrnMode = 7) OR (pbvScrnMode = 0) THENπ row = row * 8 - 1 : rows = rows * 8 - 1 ' adjust for PBπ col = col * 8 - 1 : cols = cols * 8 - 1 ' adjust for PBπ END IFπ REG %AX, 7π REG %CX, colπ REG %DX, colsπ CALL INTERRUPT %MOUSEDRIVERπ REG %AX, 8π REG %CX, rowπ REG %DX, rowsπ CALL INTERRUPT %MOUSEDRIVERπEND SUBππSUB box(row, col, rows, cols, fore, back)π ' draw single rectangleπ toprow$ = CHR$(218) + STRING$(cols - 2, 196) + CHR$(191) ' ┌──┐π botrow$ = CHR$(192) + STRING$(cols - 2, 196) + CHR$(217) ' └──┘π vert$ = CHR$(179) ' │ππ COLOR fore, backπ LOCATE row, col: PRINT toprow$;π FOR count = row + 1 TO row + rows - 2π LOCATE count, colπ PRINT vert$; SPACE$(cols - 2); vert$;π NEXTπ LOCATE count, col: PRINT botrow$πEND SUBππSUB MenuMatricesπ ' reserve rows 3 throug 12 (28-37 in the matrix) for pop down menusπ ' this is enough if your menus contain no more than 10 optionsπ mflg.menu = 25π FOR row = 3 TO 12π FOR cell = 1 TO 80π matrix(row + mflg.menu, cell) = row - 2 + 256 ' no ascii!π NEXTπ NEXTπ mflg.menu = 0πEND SUBππSUB DrawMenuBarπ mflg.menu = 25π COLOR 0, 7π LOCATE 1, 1 : PRINT SPACE$(80);π LOCATE 1, 5 : PRINT "ile"π COLOR 15, 7π LOCATE 1, 4 : PRINT "F"π FOR cell = 4 TO 7π matrix(1, cell) = %ALTFπ matrix(1 + mflg.menu, cell) = %ALTFπ NEXTπ mflg.menu = 0πEND SUBππSUB FileMenu(choice)π STATIC lastπ REDIM MenuItem (1: 4) AS LOCAL STRINGπ mflg.menu = 25π exclude = %ALTFπ options = 4π column = 3π MenuItem(1) = " Select files "π MenuItem(2) = " Not supported "π MenuItem(3) = " Bla bla "π MenuItem(4) = " Exit "π MsCursorOffπ box 2, column - 1, options + 2, LEN(MenuItem(1)) + 2, 15, 7π FOR row = 3 TO 6π LOCATE row, 3 : PRINT MenuItem(row - 2)π NEXTπ ScrollMenu last, MenuItem(), column, options, exclude, resultπ last = resultπ SELECT CASE resultπ CASE 1π mflg.menu = 0π SelectFilesπ CASE 4 : choice = %ALTXπ END SELECTπEND SUBππFUNCTION ScrollMouse AS INTEGERπ MsStatus oldButn, oldRow, oldColπ IF oldButn = 1 THEN ' test status to avoidπ ' repeat (causes flicker)π oldKey = matrix(oldRow + mflg.menu, oldCol)π END IFπ DOπ MsStatus buttons, row, colπ IF INSTAT THENπ FUNCTION = CVI( INKEY$ + CHR$(0) )π EXIT FUNCTIONπ ELSEIF buttons = 1 AND matrix(row + mflg.menu, col) <> oldKey THENπ FUNCTION = matrix(row + mflg.menu, col)π EXIT FUNCTIONπ ELSEIF buttons = 2 THEN ' right button = escapeπ ReleaseButtonsπ FUNCTION = %ESCAPEπ EXIT FUNCTIONπ END IFπ LOOP UNTIL (oldButn = 1) AND (buttons = 0) ' until releaseπ IF mflg.menu = 0 THEN ' perform doubleclickπ start# = TIMERπ DOπ MsStatus buttons, dummy, dummyπ now# = TIMERπ IF now# - start# > .5 THENπ FUNCTION = 0π EXIT FUNCTIONπ END IFπ LOOP UNTIL buttons = 1π ReleaseButtonsπ END IFπ FUNCTION = %ENTERπEND FUNCTIONππSUB ReleaseButtonsπ DOπ MsStatus buttons, dummy, dummyπ LOOP UNTIL buttons = 0πEND SUBππSUB ReadAndDisplayFilesπ temp$ = DIR$("\DOS\*.*")π DO WHILE LEN(temp$)π INCR countπ hwmany = countπ FileName(count) = LEFT$(temp$ + SPACE$(12), 12)π IF count = UBOUND(FileName) THEN ' if there are more than 60π EXIT DOπ ELSEπ temp$ = DIR$π END IFπ LOOPπ ARRAY SORT FileName()π COLOR 15, 0π FOR count = 1 TO 20π IF count > hwmany THEN EXIT SUBπ LOCATE count + 2, 2 : PRINT FileName(count);π FOR cell = 2 TO 13 ' len(filename) = 12π matrix (count + 2, cell) = count + 256 ' no asciiπ NEXTπ NEXTπEND SUBππSUB SelectFilesπ column = 2π options = 20π ScrollMenu 0, FileName(), column, options, %ALTF, resultπ MsCursorOffπ IF result = 0 THEN EXIT SUBπ COLOR 7, 0π LOCATE 25, 1π PRINT "You selected: ";FileName(result);π DOπ LOOP UNTIL LEN(INKEY$)π RestoreMainπEND SUBππSUB RestoreMainπ DEF SEG = &HB800π POKE$ 160, MainScreenπ DEF SEGπEND SUBππSUB ScrollMenu(last, item$(), column, options, exclude, result)π IF mflg.menu THENπ result = last - 1π IF result <= 0 THENπ result = 0π MsLocate 3, 5π ELSEπ MsLocate result + 2, 5π END IFπ MsRow = 1 : plus = 2π ELSEπ MsLocate 3, 5π MsRow = 3 : plus = 0π END IFππ DEF SEG = &HB800 ' assume color cardπ MenuScreen$ = PEEK$(160, 3840)π DEF SEGπ MsSetWindow MsRow, column - 1, options + plus, LEN(item$(1))π init = %YESπ DOπ MsCursorOnπ IF init AND mflg.menu THENπ init = %NOπ KeyIn = %DOWNπ ELSEπ KeyIn = ScrollMouseπ END IFππ SELECT CASE KeyInπ CASE %UPπ DECR resultπ IF result < 1 THEN result = optionsπ CASE %DOWNπ INCR resultπ IF result > options THEN result = 1π CASE %HOMEπ result = 1π CASE %ENDKEYπ result = optionsπ CASE %ESCAPEπ result = 0π EXIT DOπ CASE excludeπ result = 0π CASE 257 TO 276π ' mouse only!π result = KeyIn - 256π END SELECTπ IF result THENπ MsCursorOffπ DEF SEG = &HB800π POKE$ 160, MenuScreen$π DEF SEGπ IF mflg.menu THEN COLOR 7,0 ELSE COLOR 0, 7π LOCATE result + 2, columnπ PRINT item$(result)π END IFπ LOOP UNTIL KeyIn = %ENTER AND result ' safety firstπ MsCursorOffπ RestoreMainπEND SUBππSUB MainMenuπ DOππ IF choice THENπ KeyIn = choiceπ choice = 0π ELSEπ KeyIn = ScrollMouseπ END IFππ ' modified = %NOπ SELECT CASE KeyInπ CASE %ALTXπ MsCursorOffπ COLOR 7, 0π CLSπ SYSTEMπ CASE %ALTFπ FileMenu choiceπ END SELECTπ MsCursorOnπ MsSetWindow 1, 1, 25, 80π LOOPπEND SUBππCLSπ MenuMatricesπ DrawMenuBarπ ReadAndDisplayFilesπ DEF SEG = &HB800π MainScreen = PEEK$(160, 3840)π DEF SEGπ MousInitπ MsLocate 1, 1π MsCursorOnπ MainMenuπENDπAndrew Coggins PB NETBIOS rjohnso6@ix.netcom.com 09-01-96 (22:19) PB 430 19811 NETBIOS.BAS '==============================PBNETBIO.BAS================================π'This is public domain stuff, use at your own risk, etc. To test the useπ'of the NetBios commands used to receive and send broadcast messages overπ'a network. This sends ONE 80 character message to the other machine eachπ'time you hit "S" You must have registered an new name (and know itsπ'number) in the local name table before you can use the broadcast stuff.π'This is true for NetBIOS over NetBEUI in a DOS VDM in OS2 PEER. You mayπ'can avoid having to create a name in true DOS/NOVELL stuff. I don't haveπ'that so I can't test it. You only have to add a name once for your processπ'to use it many times. (You should probably delete it when you finish yourπ'process because the name table is finite , but OS2 deletes it for meπ'when I close the VDM so I don't worry about it. (I can't say enough goodπ'about OS2's accurate simulation of DOS (unlike Windoze XX)))ππ'This does not check for the presence of aπ'network. PB BBS has an example already that does that (PBLANT.ZIP).π'Another usefull document is Tom Thompson's NetBios Programmers Referenceπ'(1988 is the latest version I have) also on the PB BBS. This is meantπ'mostly as an example of how to set up and talk to the NetBIOS (and as aπ'result, the other computers). It wasn't meant to do anything useful, butπ'if you run it on 2 computers when you hit the "S" key on one you'll seeπ'a string pop up on the other. I recommend single stepping if you want toπ'see what is going on.ππ'The basic operation of the program is:π' 1. Establish a name and get its number in the local name tableπ' 2. Go into Receive (no wait) mode (listen for broadcast from others)π' 3. Wait on local user (You) to hit "S" or ESC (to quit)π' 4. Upon S-key, cancel Receive, issue Send Broadcast, reissue Receiveπ' 5. Upon any receive, print what was received, and reissue receive.ππ'OBTW - my name is Andy Coggins - I can be reached atπ'rjohnso6@netcom.com. I am in the discovery phase w/ this stuff myself.π'But I could find NOTHING on this on ANY board/net/ftp/www so I decidedπ'to send this up because it worked as intended and maybe it will helpπ'somebody out. If you have anything that expands on this please let meπ'know or post to the PowerBASIC site (support@powerpasic.com).π'======================================================================π%FLAGS = 0 'constants for register namesπ%AX = 1π%BX = 2π%CX = 3π%DX = 4π%SI = 5π%DI = 6π%BP = 7π%DS = 8π%ES = 9ππ'establish the Network Control block Type (64 bytes)πTYPE NCBTypeπ cmd AS BYTE ' 1-command codeπ rcode AS BYTE ' 1-return codeπ lsn AS BYTE ' 1-Local Session Numberπ locnum AS BYTE ' 1-my name # in local name table (1)π iobuff AS DWORD ' 4-FAR Pointer to I/O Bufferπ bufflen AS WORD ' 2-length of data in bufferπ callname AS STRING * 16 ' 16-remote system to callπ locname AS STRING * 16 ' 16-network name of local machineπ rectimout AS BYTE ' 1-Recieve Time Out in 1/2 Secondsπ sentimout AS BYTE ' 1-send Timeout in 1/2 secondπ inthandl AS DWORD ' 4-FAR Pointer to Post routine handler (0:0)π cardnum AS BYTE ' 1-Network Adapter number to execute commandπ cmd_ccode AS BYTE ' 1-Command Completion codeπ dum AS STRING * 14 ' 14-reserved for use by Network Card OnlyπEND TYPEππ'Initialize the NCB to all 0's (I assume they mean nulls in strings)π'You are supposed to clear the NCB each time you issue a new commandπ'(or use a different NCB)π'this should happen upon creation of the variable, so just copyπ'what was created and that is my init valueπDIM ncb AS SHARED NCBType 'working variableπDIM ncbinit AS SHARED NCBType 'initiazation valueππnetname$ = "DELL 486-50" 'a unique name to add to the name tableππMAP iobuff$$ * 512 'use 512 buffer for broadcast messagesπDIM buffaddr AS SHARED BYTE PTR 'pointer for string dataπbuffaddr = STRPTR32(iobuff$$) '32bit address of data itselfπππCLSπ'add unique name to name table and get the number returned byπ'NetBIOS.πncb = ncbinit 'clear the Network Control BlockπPRINT "Adding Name will take approx 10 seconds (why, I don't know)"πCALL NCBAddName (ncb, netname$, xcode%)πIF xcode% THENπ hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex) ";xcode%;" decimal"π GOTO End.NTTestπELSEπ PRINT "ADD Name was sucessful"π PRINT "The Name ADDED was - ";ncb.locnameπ PRINT "The Name NUMBER for this name is - ";ncb.locnumπ namenum? = ncb.locnum 'this is # to use for broadcast cmdsπEND IFπππncb = ncbinit 'must do to enter a commandπrxcnt% = 0: txcnt% = 0 'just some status countersππ'set up receive mode on each computerπCALL NCBRcvBroadcast (ncb, buffaddr, namenum?, xcode%)π'CALL PrintNCB(ncb) 'just for testingπIF xcode% THENπ hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex) ";xcode%;" decimal"π CALL PrintNCB(ncb) 'just to see what changed in the NCBπ GOTO End.NTTestπEND IF 'error code on exitππPRINT "Hit (S)end to send a broadcast, ESC to stop the program"π'This is the main program loopπchoice$ = ""πWHILE choice$ <> CHR$(27)π choice$ = INKEY$π choice$ = UCASE$(choice$)π' choice$ = "S" 'for single step testingπ IF choice$ = "S" THENπ 'cancel receive commandπ CALL NCBCancel (ncb, xcode%)π' CALL PrintNCB (ncb)π IF xcode% THENπ hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex) ";xcode%;" decimal"π CALL PrintNCB(ncb) 'just to see what changed in the NCBπ GOTO End.NTTestπ END IF 'xcode%ππ 'initiate send commandπ INCR txcnt%π ncb = ncbinit 'reinitialize ncbπ 'use a dummy dynamic string (so you will know its length)π 'change the string each time so you can see some progressπ iobuff$ = STRING$(80, LTRIM$(STR$(txcnt% MOD 10)))π CALL NCBSendBroadcast (ncb, buffaddr, namenum?, iobuff$, xcode%)π' CALL PrintNCB (ncb)π IF xcode% THENπ hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex) ";xcode%;" decimal"π CALL PrintNCB(ncb) 'just to see what changed in the NCBπ GOTO End.NTTestπ ELSEπ PRINT "Broadcast packet number - ";txcnt%π PRINT iobuff$ 'print what you sentπ 'reissue receive commandπ ncb = ncbinitπ CALL NCBRcvBroadcast (ncb, buffaddr, namenum?, xcode%)π IF xcode% THENπ hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex) ";xcode%;" decimal"π CALL PrintNCB(ncb) 'just to see what changed in the NCBπ GOTO End.NTTestπ END IF 'error code on exitπ END IFππ ELSE 'choice$ <> "s"π 'check for received message in no wait modeπ 'print received messageπ IF ncb.cmd_ccode = 255 THEN '&HFF until completedπ LOCATE 24,1π PRINT "Waiting on Send Broadcast from other computer - ";waitcnt&;π INCR waitcnt&π ELSEIF ncb.cmd_ccode = 0 THEN 'receive was successfulπ INCR rxcnt%π LOCATE 10,1π PRINT "Receive packet number - ";USING$("#######",rxcnt%);" From ";ncb.callnameπ msg$ = LEFT$(iobuff$$, ncb.bufflen)π PRINT msg$π msg$ = ""π 'reissue receive commandπ ncb = ncbinitπ CALL NCBRcvBroadcast (ncb, buffaddr, namenum?, xcode%)π IF xcode% THENπ hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex) ";xcode%;" decimal"π CALL PrintNCB(ncb) 'just to see what changed in the NCBπ GOTO End.NTTestπ END IF 'error code on exitπ ELSE 'we had some netbios error - never happened in my testπ hexxcode$ = RIGHT$("00"+HEX$(ncb.cmd_ccode),2)π PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex) ";xcode%;" decimal"π CALL PrintNCB(ncb) 'just to see what changed in the NCBπ GOTO End.NTTestπ END IF 'ncb.cmd_ccodeπ END IF 'choice$ = "s" or notπWENDππEnd.Nttest:πPRINT "The program is finished - I hope you enjoyed this as much as I did"πENDπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'Below are the Network generic routines.π'A routine to dump the Network Control Block to the ScreenπSUB PrintNcb (ncb AS NCBType) LOCALπ PRINT "This is the value in each NCB field"ππ PRINT "cmd = "; ncb.cmdπ PRINT "rcode = "; ncb.rcodeπ PRINT "lsn = "; ncb.lsnπ PRINT "locnum = "; ncb.locnumπ PRINT "iobuff = "; ncb.iobuffπ PRINT "bufflen = "; ncb.bufflenπ PRINT "callname = "; ncb.callnameπ PRINT "locname = "; ncb.locnameπ PRINT "rectimout = "; ncb.rectimoutπ PRINT "sentimout = "; ncb.sentimoutπ PRINT "inthandl = "; ncb.inthandlπ PRINT "cardnum = "; ncb.cardnumπ PRINT "cmd_ccode = "; ncb.cmd_ccodeπ PRINT "dum = "; ncb.dumππ IF ncb.bufflen <> 0 THENπ DIM x AS BYTE PTR 'handle string 1 byte at a timeπ x = ncb.iobuff 'transfer 32bit address of message bufferπ FOR count% = 1 TO ncb.bufflen 'read msg buffer 1 byte at a timeπ inchar$ = CHR$(@x) '@z points to an ASCII byteπ msg$ = msg$ + inchar$ 'build a string for viewing in IDEπ INCR x ' increment the pointer itselfπ NEXT count%π PRINT "|" + msg$ + "|"π END IF 'anything in the io buffer?πEND SUB 'PrintNcbπ'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'display the NCB Status stuff. I got junk for the most of these, but thatπ'could be because of OS2's virtualization (or it could be me taking itπ'apart wrong) I only wanted to look at the name table and I got that partπ'right. If you want to get the rest of the status fields correct youπ'need better documentation than I have. If you correct it, feel free toπ'just replace this post w/ the correct stuff.π'This routine is not called in this program.πSUB DispNcbStatus (ncb AS NCBType, a$$) LOCALπ'a$$ is the global message buffer iobuff$$π'take apart the message buffer returned by the &H33 command to NetBiosπ'ie. show me satus of thingsπDIM y AS BYTE PTR 'a local byte pointer to walk down the string withπy = ncb.iobuff 'same as STRPTR32(a$$)ππnamerows% = (ncb.bufflen - 60)\18πDIM Locname$(1:namerows%, 1:3) 'table for local namesππ'there is probably an easier way to do this, but I don't need it,soπ'I didn't spend time thinking about it.πnodename$ = GimmeHex$(a$$, 1, 6)πjumpstat$ = GimmeHex$(a$$, 7, 1)πpost$ = GimmeHex$(a$$, 8, 1)πversion$ = GimmeHex$(a$$, 9, 2)πminrun$ = GimmeHex$(a$$, 11,2)πcrcerr$ = GimmeHex$(a$$, 13,2)πalignerr$ = GimmeHex$(a$$, 15,2)πcoliderr$ = GimmeHex$(a$$, 17,2)πaborterr$ = GimmeHex$(a$$, 19,2)πtxpacket$ = GimmeHex$(a$$, 21,4)πrcpacket$ = GimmeHex$(a$$, 25,4)πtxretry$ = GimmeHex$(a$$, 29,2)πrxnobuf$ = GimmeHex$(a$$, 31,2)πdum1$ = GimmeHex$(a$$, 33,8)πfreencb$ = GimmeHex$(a$$, 41,2)πlastresetncb$ = GimmeHex$(a$$, 43,2)πmaxresetncb$ = GimmeHex$(a$$, 45,2)πdum2$ = GimmeHex$(a$$, 47,4)πnumsess$ = GimmeHex$(a$$, 51,2)πlastresetsess$ = GimmeHex$(a$$, 53,2)πmaxresetsess$ = GimmeHex$(a$$, 55,2)πmaxpacketsize$ = GimmeHex$(a$$, 57,2)πnumnames$ = GimmeHex$(a$$, 59,2)π'below are the local namesπFOR i% = 0 TO namerows%-1π Locname$(i%+1, 1) = MID$(a$$, 61+(18*i%),16) 'local nameπ Locname$(i%+1, 2) = LTRIM$(STR$(ASCII(MID$(a$$, 77+(18*i%),1)))) 'name #π Locname$(i%+1, 3) = BinFmt$(ASCII(MID$(a$$, 78+(18*i%),1)),8) 'statusπNEXT i%πππPRINT "nodename$ = "; nodename$; " ";πPRINT "jumpstat$ = "; BimFmt$(VAL("&H"+jumpstat$),8); " ";πPRINT "post$ = "; VAL("&H"+post$); " ";πPRINT "version$ = "; version$; " "πPRINT "minrun$ = "; VAL("&H"+minrun$); " ";πPRINT "crcerr$ = "; VAL("&H"+crcerr$); " ";πPRINT "alignerr$ = "; VAL("&H"+alignerr$); " ";πPRINT "coliderr$ = "; VAL("&H"+coliderr$); " ";πPRINT "aborterr$ = "; VAL("&H"+aborterr$); " "πPRINT "txpacket$ = "; VAL("&H"+txpacket$); " ";πPRINT "rcpacket$ = "; VAL("&H"+rcpacket$); " ";πPRINT "txretry$ = "; VAL("&H"+txretry$); " ";πPRINT "rxnobuf$ = "; VAL("&H"+rxnobuf$); " "π'PRINT "dum1$ = "; dum1$πPRINT "freencb$ = "; VAL("&H"+freencb$); " ";πPRINT "lastresetncb$ = "; VAL("&H"+lastresetncb$); " ";πPRINT "maxresetncb$ = "; VAL("&H"+maxresetncb$); " "π'PRINT "dum2$ = "; dum2$πPRINT "numsess$ = "; VAL("&H"+numsess$); " ";πPRINT "lastresetsess$ = "; VAL("&H"+lastresetsess$); " ";πPRINT "maxresetsess$ = "; VAL("&H"+maxresetsess$); " ";πPRINT "maxpacketsize$ = "; VAL("&H"+maxpacketsize$); " ";πPRINT "numnames$ = "; VAL("&H"+numnames$); " "πPRINTπPRINT " LOCAL Name Table follows"π'below are the local namesπFOR i% = 0 TO namerows%-1π PRINT "Name = ";Locname$(i%+1, 1); " ";π PRINT "NameNum = ";Locname$(i%+1, 2); " ";π PRINT "Status = ";Locname$(i%+1, 3); " "πNEXT i%ππEND SUB 'DispNcbStatusπ'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'to look at the binary representation of a value (from PB3 help)πFUNCTION BinFmt$(value&,size%) ' returns a binary string of size% digitsπ BinFmt$ = RIGHT$("000000000000000"+BIN$(value&),size%)πEND FUNCTION 'BinFmt$π'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'not used in this program (used by the DispNcbStatus routine)πFUNCTION GimmeHex$(a$$, start%, length%)π 'since y is pointing to 1st byte already, we want to hand it a start% = 1π '(like MID$) but we don't want to add 1 to it. If we want it to start atπ 'position 7 we want to add 6 to it.π DIM y AS BYTE PTRπ y = STRPTR32(a$$)ππ INCR y, start%-1π FOR i% = 1 TO length%π a$ = a$ + RIGHT$("00"+HEX$(@y),2)π INCR yπ NEXT i%π FUNCTION = a$πEND FUNCTION 'GimmeHex$π'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'just to consolidate code the call and the associated return valueπ'are passed to and from this routineπSUB CallNcb (ncb AS NCBType, rcode%) LOCALπncbseg?? = VARSEG(ncb) 'find our typed var in memoryπ'ncbseghex$ = HEX$(ncbseg??)πncbofs?? = VARPTR(ncb)π'ncbofshex$ = HEX$(ncbofs??)ππREG %ES, ncbseg??πREG %BX, ncbofs??πCALL INTERRUPT &H5CπAL?? = REG(%AX) AND &H00FFπrcode% = AL?? 'AL = 0 means no errorππEND SUB 'Call Ncbπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'not used in this routineπSUB CheckAddapterStatus (ncb AS NCBType, buffaddr AS DWORD, rcode%) LOCALππncb.cmd = &h033 'send a broadcast in wait modeπncb.cardnum = 0 'send message from 1st network card in machineπncb.callname = "*" 'use my local call nameπncb.iobuff = buffaddr '32 bit address of the msg bufferπncb.bufflen = 512 'length of the message bufferππCALL CallNcb (ncb, rcode%)ππEND SUB ' CheckAddapterStatusπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'add a name to the local name tableπSUB NCBAddName(ncb AS NCBType, addname$, rcode%) LOCALπncb.cmd = &H030 'add name command - wait modeππncb.cardnum = 0 'use 1st network card in machineπncb.locname = addname$ 'name to addππCALL CallNcb (ncb, rcode%)ππEND SUB 'NCBAddNameπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'delete a name from the local name tableπSUB NCBDeleteName(ncb AS NCBType, delname$, rcode%) LOCALπncb.cmd = &H031 'delete name command - wait modeππncb.cardnum = 0 'use 1st network card in machineπncb.locname = delname$ππCALL CallNcb (ncb, rcode%)ππEND SUB 'NCBDeleteNameπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'set up to receive, use no wait mode so you can do other thingsπ'like get operator input. (you can keep checking forπ'ncb.cmd_ccode <> &HFF to see if you received anything)πSUB NCBRcvBroadcast(ncb AS NCBType, buffaddr AS DWORD, namenum?, rcode%) LOCALπ'ncb.cmd = &H023 'receive command - wait modeπncb.cmd = &H0A3 'receive command - nowait modeππncb.cardnum = 0 'use 1st network card in machineπncb.locnum = namenum? 'my number in local name tableπncb.iobuff = buffaddr '32 bit address of the msg bufferπncb.bufflen = 512 'default (max) length of the message bufferππCALL CallNcb (ncb, rcode%)ππEND SUB 'Receive Broadcastπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'send a broadcast to EVERYBODY that has any kind of receive broadcastπ'issued (I'm sure this could screw up some complex programs)πSUB NCBSendBroadcast(ncb AS NCBType, buffaddr AS DWORD, namenum?, iobuff$, rcode%) LOCALπSHARED iobuff$$πncb.cmd = &H022 'send command - wait modeππncb.cardnum = 0 'use 1st network card in machineπncb.locnum = namenum? 'my position in local name tableπncb.iobuff = buffaddr '32 bit address of the msg bufferπiobuff$$ = iobuff$πncb.bufflen = LEN(iobuff$) 'length of the message to sendπππCALL CallNcb (ncb, rcode%)ππEND SUB 'Send Broadcastπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'must cancel an unfinished command issued by a ncb before usingπ'THAT ncb for another command (you wouldn't believe how things bombedπ'when I didn't cancel receive before I tried to send)π'I used wait mode (it was instantaneous)πSUB NCBCancel(ncb AS NCBType, rcode%) LOCALπncb.cmd = &H035 'cancel command for this ncb - wait modeππncb.cardnum = 0 'use 1st network card in machineππCALL CallNcb (ncb, rcode%)π'I think OS/2 returns a 24h (36) (command competed before could cancel) toπ'cancel a receive broadcast command, so I will treat this as no error.πIF rcode% = 36 THEN rcode% = 0πEND SUB 'NCBCancelπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''πRyan White R-RAD TYPER BIGFOOT@InfoAve.Net 09-21-96 (17:53) QB, QBasic, PDS 131 3934 KRAD.BAS 'Rrad typer... Kinda like krad, only made by me so I can understand it.π'By Ryan Whiteπ'Feel free to change and mess with it.π'Suggested edits: make colors 1-15 more intense with out-commands, put in aπ' text menu like interface, make the characters where U canπ' read them your way, make it where you type a normal page,π' and the program converts the page to Rrad.π' Warning to newbies DONT use ASC #'s 0 to 32!!! Just dont.πSCREEN 0, 0, 0, 0πCLSπWIDTH 80, 50πCOLOR 15, 0πON KEY(1) GOSUB chngcol: KEY(1) ONπON KEY(2) GOSUB clr: KEY(2) ONπON KEY(3) GOSUB redo: KEY(3) ONπON KEY(4) GOSUB enditnow: KEY(4) ONπPRINT "This is R-rad typer. Just type the letter and it's done."πPRINT "Commands: Press F1 to change colors, F2 to clear screen, F3 to restart,"πPRINT "and F4 to quit. **** To get the effect of pressin enter.. you must type"πPRINT "an appostrophe(`) The thing next to the 1.": PRINTπINPUT "Enter new filename and extension:", fle$πOPEN fle$ FOR OUTPUT AS #1πCLSπst:πDOπAns$ = INKEY$πLOOP UNTIL Ans$ <> ""πIF col >= 75 THEN col = 0: PRINT : PRINT #1,πSELECT CASE UCASE$(Ans$)π CASE "A"π PRINT "Æ"; : PRINT #1, "Æ"; : col = col + 1π CASE "B"π PRINT "ß"; : PRINT #1, "ß", : col = col + 1π CASE "C"π PRINT "<"; : PRINT #1, "<"; : col = col + 1π CASE "D"π PRINT "|)"; : PRINT #1, "|)"; : col = col + 2π CASE "E"π PRINT "Σ"; : PRINT #1, "Σ"; : col = col + 1π CASE "F"π PRINT "ƒ"; : PRINT #1, "ƒ"; : col = col + 1π CASE "G"π PRINT "G"; : PRINT #1, "G"; : col = col + 1π CASE "H"π PRINT "]-["; : PRINT #1, "]-["; : col = col + 3π CASE "I"π PRINT "│"; : PRINT #1, "│"; : col = col + 1π CASE "J"π PRINT "⌡"; : PRINT #1, "⌡"; : col = col + 1π CASE "K"π PRINT "]<"; : PRINT #1, "]<"; : col = col + 2π CASE "L"π PRINT "£"; : PRINT #1, "£"; : col = col + 1π CASE "M"π PRINT "/\/\"; : PRINT #1, "/\/\"; : col = col + 4π CASE "N"π PRINT "ⁿ"; : PRINT #1, "ⁿ"; : col = col + 1π CASE "O"π PRINT "()"; : PRINT #1, "()"; : col = col + 2π CASE "P"π PRINT "₧"; : PRINT #1, "₧"; : col = col + 1 'just imaging the t wasn't thereπ CASE "Q"π PRINT "q"; : PRINT #1, "q"; : col = col + 1π CASE "R"π PRINT "Γ"; : PRINT #1, "Γ"; : col = col + 1π CASE "S"π PRINT "$"; : PRINT #1, "$"; : col = col + 1π CASE "T"π PRINT "╤"; : PRINT #1, "╤"; : col = col + 1π CASE "U"π PRINT "ü"; : PRINT #1, "ü"; : col = col + 1π CASE "V"π PRINT "\/"; : PRINT #1, "\/"; : col = col + 2π CASE "W"π PRINT "\/\/"; : PRINT #1, "\/\/"; : col = col + 4π CASE "X"π PRINT "><"; : PRINT #1, "><"; : col = col + 2π CASE "Y"π PRINT "¥"; : PRINT #1, "¥"; : col = col + 1π CASE "Z"π PRINT "z"; : PRINT #1, "z"; : col = col + 1π CASE "!"π PRINT "¡"; : PRINT #1, "¡"; : col = col + 1π CASE "?"π PRINT "¿"; : PRINT #1, "¿"; : col = col + 1π CASE "1"π PRINT "I"; : PRINT #1, "I"; : col = col + 1π CASE "2"π PRINT "II"; : PRINT #1, "II"; : col = col + 1π CASE "3"π PRINT "III"; : PRINT #1, "III"; : col = col + 1π CASE "4"π PRINT "IV"; : PRINT #1, "IV"; : col = col + 1π CASE "5"π PRINT "V"; : PRINT #1, "V"; : col = col + 1π CASE "6"π PRINT "VI"; : PRINT #1, "VI"; : col = col + 1π CASE "7"π PRINT "VII"; : PRINT #1, "VII"; : col = col + 1π CASE "8"π PRINT "VIII"; : PRINT #1, "VIII"; : col = col + 1π CASE "9"π PRINT "IX"; : PRINT #1, "IX"; : col = col + 1π CASE "0"π PRINT "º"; : PRINT #1, "º"; : col = col + 1π CASE "`"π PRINT : PRINT #1, : col = 0π CASE "."π PRINT "."; : PRINT #1, "."; : col = col + 1π CASE " "π PRINT " "; : PRINT #1, " "; : col = col + 1πEND SELECTπGOTO stππchngcol:πc = INT(RND * 15) + 1πCOLOR cπRETURNπclr:πCLS 'WOWπRETURNπredo:πCLOSE #1πOPEN fle$ FOR OUTPUT AS #1πCLS : PRINT "Filename is empty..."πPRINT "Type on...": PRINT : PRINTπRETURNπenditnow:πCLOSE #1πPRINT "Done editing. "; fle$; "is alive now. Have fun. Byebye"πENDπKurt Kuzba FAST GET/PUT TEXT FidoNet QUIK_BAS Echo 09-24-96 (00:00) QB, PDS 105 6894 GPTXT.BAS DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"GPTXT.ZIP",4^6:Z&=4898:?STRING$(50,177);πU"%up()%9%%%R-%=d7qFg\6+GF'.%%k(%%%.%%%%lu(y'yS#tgoD&atm9mvA#8q>EπU"ofleesTe99GI3<5_v<W3buQth<Q9gSg]CMahD%MmGm\pho[H>bnCJaUr\$'lab.πU"J-QGf5mVw8kIcEYIQ<1[pQs82lE%.nIU8ruwWhp3WKNDE_p3<Zsw-L?lgr#>']9πU"pYe/)KR.uLT:q%FIEF3U,<AfEe8yyKiPA==;tT\jK3q?yUOy[h;)Y3MCO\#Z(dTπU"JP^7fiEVHLG:<.X$5+6f<ZyVj=[hfUm0-HapYy.kxJrJIXp%ma2ZCA:;vg\v%HYπU"hz2y(iSQmcd&gi(T;_<1j<9IwQ,)qpTVzUODz1ZQmM$'=I'B9Ue]*P$0vx'1I(TπU"UU7+xbQSe_9B2(b[fQ,f:1?cW&N,ou>1g=dJlSJ+WZ#_MA/&LH/NY1Kc+[&RlM=πU"Adp+Gr6[8+j6bK/90BViE/0'+8L92jTc-Ml5Ax3d(a#l939skj68E/i/hw4&Hh/πU"h?_.740hK:0;qum_9fwic>p0k52l?Ss<#xN6NN,I&Z0/^3,,_4'n.C8fVdp<5e&πU"ytIp7qsYQd5wfBZ/BzM0;E(-C_*p*:)\r&H6AJ2IU0E/V=a]MT#wG2T=/N^1-AnπU"*aoa&roX7#.8gn2le5#^EHzDr\NFjxGTM'A()aSRB\5wjR,NSS-Zr_lB7S\K=j9πU"Q/I+UPHcsg1Qt(__2YjPOXoOBgZ>qBun[(Fle5b*r^arGB:.bwiHXO4izmWI&CcπU"OpK,>>=%fSyG>MIgy)sX]OSXNG8uqtjb1F8Wkr)]QXk=:8Q0-==]wI?F]xj<iXvπU"EKbrAlF2Y1j[*CNa'#Dup%()9%%%%-%*\dqFTpCRe'32%%'N:%%%.%%%#luy'%yπU"SvqOgfgJACyze$?FzVW3d'c^FR=b[1KR<XiSQw%N*F8(3H:5#hmw_C/_s(\HfE(πU"H'3:Kq1oSOGGbeR/R=D;%'_S98*-V8RCh^P1+XVV]I-F/OGS)pD7if-WK(MKHpMπU"*+fwXNHe)xxXlvoHfbBoc$iWj3G9;5vX/xYRG'qAX6YLjY<N-TaW]Ae8bbgb&iCπU"-g&5&Pgu/%C(pe^8GA-SO<9)0)6;';>Rpf+La&L3:8?&\+(k<%VxG=a4g*L7e;AπU"(E>/Fw.%pP<Ia.%Pa<:[)+8e&b'Y5].^sR0929S>UaCU0K09Y_*BkeV'7-O9wBYπU"*tQazYj)j3-RF8/#Q.EoOC?%-A&L?:PYQB1-kOe3_5+/PV/A8g%g(14PN&[^EDEπU"1(4o/'M&*aC2M2%VRf9://PG<oe't9+&iVU1FN#E(C[+.n/A)K,0MDk*V0xXsJKπU"<]5tb/;.M':2GX-6;g'>RpIfL'WH/41-]CWKK\zE-sN9nO;LosI?+5AwGfV&i9_πU"NQCie[^$wlxlNl^X.b4lk%\sdAHSD>DcUBgty2-S)W_2Z&2N#u..]Sn=(c[3MaGπU"v26?+2B%=rM4^)11(N2(P2;s[3Q%)a140%WFa*nWrktZd-.[w/zXBOVThC4GY,cπU":V74N)x3Dj)5bbIierWNO\yLVtDc*c_xB3Oj40ak-_%B<xUv6&N#V,k%_S^3kwDπU"jlMQdeu8<VUNy^%W$W\qicWhcu1qmY=o#AKAY]UrOaN0L9?Y5dYqw^f5V[rVc?xπU"]?>jjuELkz)104:2A6r&P:$j)QHY7*A$_Qgs=KKEZ/OUh\DSgQ&]WDgpVG4%p=GπU"DAG]qg%#rP?k\%NNqek7D]&lAC7682#k&B_fv_G*X[hk]QxBk0F];ykqw(fV&bLπU"brG$x+:_7xm&Dp#\FI.2<RtShd$TIwM61j3vL4sEJ3LM0JohTK^UdapmLZA\LY\πU"5=='hgGGGbHvX_zwUncDOn$.MGn,B0#Gb59e7AOSLAD/5Bm,dJnTh/*hzH\<h#eπU"=hcJ*WT24ckSm=XPwm->ZesfM4N6v^]5SASFCwpAueI3k,-SpTF2x,DXqGaG(MrπU"H[kr<kJt0Ca)q3CEG<a_LGZ<(K-uDSiNMdL68jw]]w>dV$m^Bk92:LaMhZgWAsEπU"v3H^P878YKrH8^9Z>\*9\J\)&rPm9-wE:YFwqx&:uqiL$'oqZ4h'/1ST41QS%/hπU"F^*<9g8C*\MH5L:[tvi4'$Y7/8K^/]p0iK&UtP;f'$Y'/8']/Kw-1F:AFlZ<+]:πU"I/(/A*NkB<tj+c:jY%ReKI?IbITUA:E88TQ22fAUpHJkXGSiaiVPb1?rzriPG,#πU"di:h-qFTk'upB+:+m&nVSU\%U5eb#+lk$(8Bo$cc]\16.2+%6?pzf->D77r_j1>πU"p$<'>*>R;K.l:yb[MR>$uKNx&X)?0tN4.wB&xpBfj>NgyvYMZUNANvfV[BSqWIoπU"=3ZOGJOmMDBnhEKQ$;$>52v/YmX*,SMNoWlklqI^Z)yQ.KDteS>qCPYhKcmUuWOπU"dVuMK;rF7)tn2'P]f^KJPXPdf,j;V#YN%SB[fJ8F1YZMH?\f]FG?;ojk[T*3AKcπU".Dcoc[/)UnMLVp;Fob+p8RD3bj8I:OC/L&rtlq)0C6lBudjbl,vQoFkJ;0#DonFπU"i>(K?6n(oF1yE,$o^kc);5CQUDBX0vr?x>YDPjjTF#)U<)g9x:TUhBP)?[;kqO$πU"kLO9n(2OvBF>SdTiV[xCVtE8Xkv]oT/>t-01D4Z8z,.x,EmIltjI2IFg_+LShTaπU"xa]nu4]DkIU>dglorG6_TUNB?+4>Cjyexx,4h?=HwgBnD0j[<;YiiX2+aaM&trCπU"l0o-AWS9\.KupGcgne4[Tu3lux?&od(R_#eJ494IMWn/YJ_HHgt;5R/0qY46SA2πU"_?ekrF*o]I;#.jKerEAe]QpDBib3pGZ48r=doP(2lKO#ONiyPlff_K*jPhIkx7)πU"83h-=SIEkA's:JS'i\nZH#_?dp0$4;9$oDr0$<kc?a?L%AvVbxq[eTSe5?FFE_FπU",I>ti2cB21\(MnKvP6AKZ)ULxL^:x/s5e$w7h1O;n%<P9UV/YBIrS$w8G5Mi\FWπU"]rfSBvW'JrL6QsE31Z,^U,xtdx4N07zsO8DbwJ53%eg)S9psYagf9/Q/8WooTd;πU"hX,BQP0Wg6v9*[\#c#-q]8w,flfo3q$d-obT0]F3y2lKkWi.X=2DL2QtZpYmERNπU"8MRkJ8sIswmp#A7H<^>S\NfaZgPEhjSH47h8=q%0<QO<f^?I>:vQmP/s&q5OZ8HπU"ZvoD1oh7-6nJxX43NRi1Z_rHWaRMGfk<XXnZpxqLrR8A$PFxoel,,kvtd,AvTY&πU"i/9t9uO7*H&b%8kdQhJJ--NcpE6rMGqEF[ZaIQE.Fv]x6a=$Ma=UY;,ue]I'a0oπU"<*c]gWitu7([s[sZ#Qc\WP.FqoAX]r9VKCrd4]<5,ff$gH$&;3xsm1*m]?=rSP\πU".n:;8TL$k],t=71'Lz9l6_;TDUlKgAU50v9fMkI49f76>dSw#xTZh<pxmLr\5sNπU"cJ/cgmPw_gxnt3AFJ]+fqA-n:d4kuYN5g\HnBaH>+8a?HmYFVV/idj^,?oF8Gk#πU"JE$62m]p\EHGRhkXbER3iGu?o(-6x^5j:(Kh6(k^YA_Y;:K6,]5jF(CM6^A%E9(πU"F6Cjk:BZ_]%SIX<6tSkRY;1F6Z]YzY%aT,OGyU^zZ;U.6.k4R^;>26DkZt?O=RTπU"(]lAc_\qZ6EH(XG6D^JYQ,X?Koa6zF^tR6e:]*DHRh]*HHRpk0vP6#g]Jh,h\k<πU"ZJ;P6>GAo;6ZxGREZGW\;(,6$^6dY;<q6NYeq^kf^e;D6Vkkn?OcDR&G=cYeh?GπU")XD,B?^$HER%6[l]$C3RvkBH$e)6hRkl]q;W,HF]tX6;nBo*_6v]tYa,LktL<R0πU";klZQcER^GLS?EXc,h^4&U8H&.XemHRV%B]5':<EO3urMsCh-L4Eo4%<u+TD$3lπU"o$q5dGF7RREOaRERFoGOFG1Rllz#_$\JEgk^BL03i0cxjF8Xhuu>8nXj]fEkNVGπU"GSlnr\Px3iovn^bDJ;6+?a8x[^_>aGSb3R)uvqS=vw?9XTm%-5NBcPBC+N)V>bCπU"S;]$g:)IfyE'mCN_2MacS2CicGdYlYGrpwm.*I1Nr0MTaK(.,Qb&Xdw19mPbV)RπU"e:H#bJb5qNlEm)QcK8hC\c*;(zXE<n2nk/Iza2P)t%XY)-sFks*E&qMfWW#N>jJπU"Z0mbvlSq^>(/[YMN.WMnIp[RufXo%Juh5Ww5Fbw=^Tjna5<_N8hi/%=u14EDgjHπU"QRFMmfBPhIx5bjIQ6)k>S<M)1MjOYx=B3SD<B:Z5uZ+4&\\Y>M_JcU5rmM*4M&<πU"a9,z9aklW;pj>_6Emm^mRsdxO,ll1uVtF+,whXxhf%NQmAHC#NF84iuxHFJGG7ZπU"FbYs0_o-)&ui6Hbi2:_&.?.BH/Lrc*SCsc#T1saNTYC+u:>pL^Wg6Nm5(uwpD3hπU"eNHqCXg#PztH)8-Nm^l6wFkPJJLb9X<3zIS<MMgT>]gkfu[I-vkxgHt]LSUC$TTπU")mcpjrx>^Pc=bZJ$X37s5FRU$a.x#*O5GaX23ZeVp8\KnUs,#(b1il0kX?*%IY%πU"lWTk6aLZ3W(zb,PN3jsLD3r'(3_fc_*P(gZilYplZ.TLj3%L-d7X.Js78csv.n=πU"ta3g9Pz3c_v:POH&vH0A\uGFMTF(tmwlgcE#zPj8zZ&zWA,hxn<E0(?B,5fhzCJπU"c;LZnKl0#.$dxa-F6%MzO8fQlNfDYr/OfBh,I'p>#WE#GCHHDRlj,4uBP*fz%q7πU"5g5DHwMkITiz&*5mK=s2w33TCJNdlDA(&lEH<'P=I+3a:HTAdRSU^6o]3z>IccOπU"he$2/6,1w-6[K3g(s5[zr1z6WHs?OA<]X//?puu7,^Pl8J=YIy05Iky4Zse\pj6πU"oq/ezH9I4'>w5Yoyhla;7i$PZc7HS>2ms_ZHrXi6,I7V^$b#_0X/pqB&0g6hyODπU"L/ur1[Tvs#fg?jE>Km#bb'o>drhs.W+u/pgk[w%3(y:e^ahG%daF).Y&jty,zmCπU"c]E20LQW)_4i0&8IV;s7yr/(,-Oas9nW%U4;oV4sPDXHu.-^<)\:?c?K\.8__+iπU"DZr0nC4.h[Yu%,;0XXm0r2JbuCJ.GDSg_f5##;t;'oODJe[I2>d9#:ix?x&XP;JπU"nI[MMTOzd*BazU--0*4]#aM-vOgnm\K7#M00bc0Z&%j#V5b(%pu64*2r'uG,C]9πU"Z&k&cmns(Q-1+C#pXSKrJ:om9qdu*lFQY%&0Ft#^&ncMMRO(Pj.,9Mb,UqIO,$cπU"_]wM_C3;4SBW$4m/HDbqsQrror9&CU;&5<X&72S8fU9<S5[E;)KBNLFpm8r-,$;πU"]N$$m>%FyULIXdN==[^WUmil5N=&72]VQhR^VaB:kZ%2rG,1v4u%p()9%%%%-4%πU"KdqLFK\\,z6&%%%h(%%%0%%%%ljy&.uzy%SgfxJdx,>Aje5KFl[d[5qQP+m6hf/πU"c1c(Y(0pFe*YkKt=;'(SAa(NkrttwqdC5;#atfF&qEVR2/l:kR]wY4=fj-,=DByπU"$E[Op,1G*'=G4.G93Wwd:2tkw]ASY:[<Vj%^ef$*zn^<\.tH/FP%<<Zbb9NH$H9πU"+?036m9Fu5%I>(B$jl'0[l%zG(:>:j-d<ob+]ZO3rF%Yt7wq-uBRcqT+2D9*/9KπU"*c[28qUS5J\NfVq-uw;n/T[Gu-J5_o's<_q;qIrCKP[1PlL5sBv)Fu]4MFEOCVwπU"pDqt,/r;p,LGDVvP/_:JpX&WNIxAY(k:$usl+wah66i)>_N8gxTl;74Njm.Gp=9πU"Ii.[X.+heSaj3>Y7(1I-N_slwm&dh9)Fr;9LLW+js7:P=9dN[i>7;6o#s:F#lW-πU"k\W.x7>TrF2vZ+M>CsM=geIIJma#NHzl,Y:$M&un,.A%Y46')Qpq4[>vPddE1c5πU":k?O&wLL'FGZqe0sjvh^zR7.b#+0?i1XeSBtYZ[hu?Rmbnn#pkK8aGtL8x<dp8pπU"op/>#;?.*(2kz&Jd(,n>Pt%#8C&.up&%'9%9%%%%-4%=dqaFg\+*GF'%(%k(%%%πU".%%%%%%%%%%%E%%%%%%%%%l.uy'y%Stgo%up&'%9%9%%%%-%*\dqFTpCRe'32%%πU"'N:%%%.%%%%%%%%%%%E%.%%m'%%%lu(y'yS%vqgu%p&'9%%9%%[%-%KAdqFKh\\πU"z6%&%%h%(%%0%%%%%%%%%&%%E%%(%N5%%%ljy&.uzy%Sgfx%up*+%%%%%%(%(%&πU"v%%%&47%%%%%πEND SUBπCLOSE:IF S=116AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπKurt Kuzba FILE SEARCH TO FIND TEXT FidoNet QUIK_BAS Echo 02-28-96 (00:00) QB, QBasic, PDS 50 1947 FINDTEXT.BAS'> I want to write a program that searchs through a fileπ'> to find a specified string. This program is prettyπ'> common to those who want to test their programmingπ'> knowledge, but I've never attempted it.π'> I need suggestions/guidance.π'>........π' How about a working example?π'_|_|_| FINDTEXT.BASπ'_|_|_| This program performs a fast file search for any givenπ'_|_|_| text, selectively allowing case sensitivity.π'_|_|_| Full overlapping is implemented for instances where theπ'_|_|_| text might span the input buffer boundaries.π'_|_|_| No guarantees or warrantees are given or implied.π'_|_|_| Released to PUBLIC DOMAIN by Kurt Kuzba. (2/28/96)πON ERROR GOTO OOpsπFileToSearch$ = "": COLOR 2, 0: CLS : LOCATE 3, 1πINPUT " Enter file name => ", FileToSearch$πIF FileToSearch$ = "" THEN CLOSE 1: ENDπINPUT " Enter text to find => ", text$πPRINT " Search case sensitive (y/n)? ";πIF text$ = "" THEN END: ELSE L% = LEN(text$): Overlap$ = ""πDOπ sensitive% = INSTR(" YN", UCASE$(INKEY$))πLOOP WHILE sensitive% < 2πPRINT MID$(" YN", sensitive%, 1)πIF sensitive% = 3 THEN text$ = UCASE$(text$)πOPEN FileToSearch$ FOR BINARY AS #1πPRINT TIME$πWHILE NOT EOF(1)π test$ = Overlap$ + INPUT$(4096, 1): TL% = LEN(test$): strpos% = 0π IF sensitive% = 3 THEN test$ = UCASE$(test$)π WHILE strpos% < TL%π found% = INSTR(strpos% + 1, test$, text$)π IF found% THENπ strpos% = found%π PRINT "Text found at"; LOC(1) - LEN(test$) + found%;π PRINT " O>=* hit a key *=<O"π WHILE INKEY$ <> "": WENDπ k$ = "": WHILE k$ = "": k$ = INKEY$: WENDπ IF k$ = CHR$(27) THEN CLOSE 1: ENDπ ELSEπ Overlap$ = RIGHT$(test$, L%): strpos% = TL%π END IFπ WENDπWEND: CLOSE 1πPRINT "end of file": PRINT TIME$: ENDπOOps:π PRINT " Disk error or bad file name ["; ERR; "]"π CLOSE 1: ENDπ'_|_|_| end FINDTEXT.BASπ 1 76 PSYCHIC-OLOGIST Nathan Wittich 1 153 CALCULATE WIND CHILL Steve Horstmeyer 1 65 IMPORT ANSI INTO BASIC FUNCTIONKurt Kuzba 1 244 LOADS 320X200X256 PCX IMAGES Tony Jones 1 20 XOR ENCRYPTION Scott Turchin 1 70 CONVERT UNIX TIME STAMP Andrew K. Dart 1 311 SOUND BLASTER STARFIELD Luke Molnar 1 883 DIRECTORY LISTER Alvin Williams 25644 242 MISC. DETECTION ROUTINES Ben Kaashoek 1 252 VGA 640X480 PANNING Douglas H. Lusher 8232 380 GUI LIBRARY V1.23 W/DOCS Tika Carr 1 92 SUBROUTINE & FUNCTION USAGE Kurt Kuzba 4597 342 GET/PUT INFO. FOR VGA MODE 13H Andrew L. Ayers 1 853 VIDEO POKER Mike Kristopert 20423 1282 RED BARON 2573 Adam Stanchos 67340 451 GAME MAPPING TECHNIQUE Eric Blanding 96780 280 PICTURE PUZZLE Robin Ohm 105006 473 QBASIC ROCKWARS Brennen Bearnes 117950 492 STICK FIGHTER Brian Flanagan 138782 317 QBASIC GAME DESIGN TUTORIAL Andre van Wyk 159559 102 GAME OF NIM Steven Anthony Morisi 162792 1767 LEGEND OF LITH 2 (RPG GAME) Matt Zuchowski 278039 639 WORMHOLE Brent P. Newhall 298124 498 JEWEL - LIKE COLUMNS The ABC Programmer 1 261 GORAU SHADED POLYGONS Luke Molnar 5784 152 FAST 320X200X256 PCX VIEWER Jonathan Leger 11570 981 GRAPHICS LOADER UPDATE Jonathan Leger 38230 39 VORTEX Ryan White 40753 80 COLOR MORPH Ryan White 43767 131 FLYING BEES #2 Ryan White 48089 135 FLYING BEES #8 Ryan White 52625 142 FLYING BEES #9 Ryan White 57241 87 GEOMETRY SICKENER Ryan White 59741 93 GEOMETRY SICKER Ryan White 62395 82 3D GRAPHS Nathan Wittich 65001 290 DEMO OF REAL-TIME GRAPHING James N. Broadbent 74295 74 SPIRALING MIND KNOCKER Ryan White 77093 89 MULTI MORPH Ryan White 79749 128 OUTLINED FONTS Phillip Jay Cohen 86220 617 MISCELLANEOUS GRAPHIC PROGRAMS Ryan White 126430 56 PLASMA KALIDA THINGY-MAJIG Ryan White 129193 321 PANNING W/256 COLORS Douglas H. Lusher 140745 301 VGA SCREEN SAVE/RESTORE FOR PB Don Schullian 160460 241 FERN FRACTAL Erika Schulze 176208 66 FALLING LEAVES SIMULATION Dave Shea 180590 409 TGA (UN/COMPRESS) VIEWER Erika Schulze/Gunther Ilzig 207423 151 SCREEN 13 PAGE FLIPPING Douglas H. Lusher 217347 55 FAST CLIP PUTTING Joshua Dickerson 218794 177 STARFIELD SIMULATION Ben Kaashoek 226788 55 DEMYSTIFY SCREEN SAVER Kurt Kuzba 229446 74 SHOW ALL COMBINATIONS OF COLORSKurt Kuzba 231698 276 ROTATING 3D CYLINDER & SPHERE Douglas H. Lusher 240139 389 COMPLETE BLAST! (MODE 13H) SUBSAndrew L. Ayers 252914 213 BLAST! MODE 13H GET ROUTINE Andrew L. Ayers 260795 179 BLAST! MODE 13H PUT ROUTINE Andrew L. Ayers 267724 71 BLAST! MODE 13H PSET ROUTINE Andrew L. Ayers 270149 102 BLAST! MODE 13H SPRITE ROUTINE Andrew L. Ayers 273434 149 GET/PUT MANIPULATION ROUTINES Andrew L. Ayers 278440 49 FAST SPRITE DEMO Andrew L. Ayers 281695 76 EXPLOSIONS EFFECT Andrew L. Ayers 283414 89 FAST & SMOOTH SCROLLING EFFECT Andrew L. Ayers 285502 148 QUADRATIC PLASMA Andrew L. Ayers 288851 146 EXPLODING PIECES EFFECT Andrew L. Ayers 292388 100 OTHER NICE SPECIAL EFFECTS Andrew L. Ayers 299011 84 MELTING SNOWMAN Robert Seidel 301530 61 BOUNCING WOODEN BALL Mathew Robertson 1 93 VIEW CONTENTS OF RAM Kurt Kuzba 1 182 PICK LIST DEMO Charles Godard 1 136 MOUSE DRIVEN TRIANGLE Nicolas Culberson 5581 335 PARALLEL PORT TEST UTILITY Marek Piotrowski 1 201 TERMINAL W/ANSI EMULATION Kurt Kuzba 7748 48 PHREAK FONE Brian Mahocker 11328 127 BACKSPACE LOCALLY & OVER MODEM Scott Turchin 1 400 MOUSE ROUTINES W/DOUBLE CLICK Egbert Zijlema 1 430 PB NETBIOS Andrew Coggins 1 131 R-RAD TYPER Ryan White 3969 105 FAST GET/PUT TEXT Kurt Kuzba 10923 50 FILE SEARCH TO FIND TEXT Kurt Kuzba